1"use strict";(self.webpackChunkmeshtastic=self.webpackChunkmeshtastic||[]).push([["23910"],{37914(e,n,t){t.r(n),t.d(n,{metadata:()=>i,default:()=>u,frontMatter:()=>d,contentTitle:()=>l,toc:()=>c,assets:()=>a});var i=JSON.parse('{"id":"software/android/user/desktop","title":"Desktop App","description":"Install and use the Meshtastic Desktop app on Linux, macOS, and Windows \u2014 connections, feature parity, and keyboard shortcuts.","source":"@site/docs/software/android/user/desktop.md","sourceDirName":"software/android/user","slug":"/software/android/user/desktop","permalink":"/docs/software/android/user/desktop","draft":false,"unlisted":false,"editUrl":"https://github.com/meshtastic/meshtastic/edit/master/docs/software/android/user/desktop.md","tags":[],"version":"current","lastUpdatedBy":"rcarteraz","sidebarPosition":14,"frontMatter":{"title":"Desktop App","sidebar_position":14,"last_updated":"2026-07-07T00:00:00.000Z","description":"Install and use the Meshtastic Desktop app on Linux, macOS, and Windows \u2014 connections, feature parity, and keyboard shortcuts.","parent":"User Guide"},"sidebar":"Sidebar","previous":{"title":"Firmware Updates","permalink":"/docs/software/android/user/firmware"},"next":{"title":"How the Meshtastic Signal Meter Works","permalink":"/docs/software/android/user/signal-meter"}}'),s=t(91987),r=t(67008),o=t(87622);let d={title:"Desktop App",sidebar_position:14,last_updated:new Date("2026-07-07T00:00:00.000Z"),description:"Install and use the Meshtastic Desktop app on Linux, macOS, and Windows \u2014 connections, feature parity, and keyboard shortcuts.",parent:"User Guide"},l="Desktop App",a={},c=[{value:"Installation",id:"installation",level:2},{value:"Linux",id:"linux",level:3},{value:"macOS",id:"macos",level:3},{value:"Windows",id:"windows",level:3},{value:"Connecting Your Radio",id:"connecting-your-radio",level:2},{value:"USB Serial (Primary)",id:"usb-serial-primary",level:3},{value:"TCP/IP",id:"tcpip",level:3},{value:"Bluetooth (BLE)",id:"bluetooth-ble",level:3},{value:"Feature Parity",id:"feature-parity",level:2},{value:"UI Differences",id:"ui-differences",level:2},{value:"Keyboard Shortcuts",id:"keyboard-shortcuts",level:3},{value:"Window & System Tray",id:"window--system-tray",level:3},{value:"Notification Preferences",id:"notification-preferences",level:3},{value:"Built-in Documentation Browser",id:"built-in-documentation-browser",level:2},{value:"Building from Source",id:"building-from-source",level:2},{value:"Known Limitations",id:"known-limitations",level:2},{value:"Related Topics",id:"related-topics",level:2}];function h(e){let n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"desktop-app",children:"Desktop App"})}),"\n",(0,s.jsx)(n.p,{children:"The Meshtastic Desktop application shares its core codebase with Android via Kotlin Multiplatform. Most features work identically on Linux, macOS, and Windows."}),"\n",(0,s.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,s.jsx)(n.h3,{id:"linux",children:"Linux"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Download the ",(0,s.jsx)(n.code,{children:".deb"})," or ",(0,s.jsx)(n.code,{children:".AppImage"})," package from the releases page"]}),"\n",(0,s.jsxs)(n.li,{children:["Or build from source using ",(0,s.jsx)(n.code,{children:"./gradlew :desktopApp:run"})]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"macos",children:"macOS"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Download the ",(0,s.jsx)(n.code,{children:".dmg"})," package from releases"]}),"\n",(0,s.jsx)(n.li,{children:"Or build from source"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"windows",children:"Windows"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Download the ",(0,s.jsx)(n.code,{children:".msi"})," installer from releases"]}),"\n",(0,s.jsx)(n.li,{children:"Or build from source"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"connecting-your-radio",children:"Connecting Your Radio"}),"\n",(0,s.jsx)(n.h3,{id:"usb-serial-primary",children:"USB Serial (Primary)"}),"\n",(0,s.jsx)(n.p,{children:"The most reliable connection method on Desktop:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Connect your Meshtastic radio via ",(0,s.jsx)(o.A,{term:"USB",definition:"The wired connection used to power a device, flash firmware onto it, and communicate with it over serial.",routePath:"/docs/terms/",children:"USB"})," cable."]}),"\n",(0,s.jsx)(n.li,{children:"The app should detect the serial port automatically."}),"\n",(0,s.jsx)(n.li,{children:"If not detected, select the correct serial port from the Connect menu."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"tcpip",children:"TCP/IP"}),"\n",(0,s.jsx)(n.p,{children:"For network-connected radios:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Enter the radio's IP address and port (
1default: 4403)."}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"Connect"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"bluetooth-ble",children:"Bluetooth (BLE)"}),"\n",(0,s.jsxs)(n.p,{children:["Bluetooth Low Energy is supported on Desktop via the ",(0,s.jsx)(n.a,{href:"https://github.com/JuulLabs/kable",children:"Kable"})," library:"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Ensure your system has a Bluetooth adapter."}),"\n",(0,s.jsx)(n.li,{children:"The app scans for nearby Meshtastic radios automatically."}),"\n",(0,s.jsx)(n.li,{children:"Select your device from the Connect screen."}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"feature-parity",children:"Feature Parity"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Feature"}),(0,s.jsx)(n.th,{children:"Android"}),(0,s.jsx)(n.th,{children:"Desktop"}),(0,s.jsx)(n.th,{children:"Notes"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Messaging"}),(0,s.jsx)(n.td,{children:"\u2713"}),(0,s.jsx)(n.td,{children:"\u2713"}),(0,s.jsx)(n.td,{children:"Full parity"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Node List"}),(0,s.jsx)(n.td,{children:"\u2713"}),(0,s.jsx)(n.td,{children:"\u2713"}),(0,s.jsx)(n.td,{children:"Full parity"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Map"}),(0,s.jsx)(n.td,{children:"\u2713"}),(0,s.jsx)(n.td,{children:"\u25D0"}),(0,s.jsx)(n.td,{children:"Map tab exists on desktop, but the interactive map view is Android-only"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Settings"}),(0,s.jsx)(n.td,{children:"\u2713"}),(0,s.jsx)(n.td,{children:"\u2713"}),(0,s.jsx)(n.td,{children:"Full parity"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsxs)(n.td,{children:["Bluetooth (",(0,s.jsx)(o.A,{term:"BLE",definition:"The default wireless connection between a node and a phone client.",routePath:"/docs/terms/",children:"BLE"}),")"]}),(0,s.jsx)(n.td,{children:"\u2713"}),(0,s.jsx)(n.td,{children:"\u2713"}),(0,s.jsx)(n.td,{children:"Via Kable on desktop"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Firmware Update"}),(0,s.jsx)(n.td,{children:"\u2713"}),(0,s.jsx)(n.td,{children:"\u2713"}),(0,s.jsxs)(n.td,{children:["In-app ",(0,s.jsx)(o.A,{term:"USB",definition:"The wired connection used to power a device, flash firmware onto it, and communicate with it over serial.",routePath:"/docs/terms/",children:"USB"}),", ",(0,s.jsx)(o.A,{term:"BLE",definition:"The default wireless connection between a node and a phone client.",routePath:"/docs/terms/",children:"BLE"}),", and Wi-Fi (",(0,s.jsx)(o.A,{term:"ESP32",definition:"A chipset of microcontroller made/designed by Espressif, used by a number of devices. Higher power usage than nRF52, but often cheaper and supports Wi-Fi if desired.",routePath:"/docs/terms/",children:"ESP32"}),") update all work the same as Android"]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Notifications"}),(0,s.jsx)(n.td,{children:"\u2713"}),(0,s.jsx)(n.td,{children:"\u2713"}),(0,s.jsx)(n.td,{children:"Native OS notifications"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Widgets"}),(0,s.jsx)(n.td,{children:"\u2713"}),(0,s.jsx)(n.td,{children:"\u2717"}),(0,s.jsx)(n.td,{children:"Android-only"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Android Auto"}),(0,s.jsx)(n.td,{children:"\u2713"}),(0,s.jsx)(n.td,{children:"\u2717"}),(0,s.jsx)(n.td,{children:"Android-only \u2014 not available on Desktop or iOS"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"AI Assistant (Chirpy)"}),(0,s.jsx)(n.td,{children:"\u2713*"}),(0,s.jsx)(n.td,{children:"\u2717"}),(0,s.jsx)(n.td,{children:"Google flavor Android only"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"App Functions (system AI)"}),(0,s.jsx)(n.td,{children:"\u2713\u2020"}),(0,s.jsx)(n.td,{children:"\u2717"}),(0,s.jsx)(n.td,{children:"Google flavor Android only"})]})]})]}),"\n",(0,s.jsx)(n.p,{children:"*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware."}),"\n",(0,s.jsxs)(n.p,{children:["\u2020App Functions exposes app actions to the Android system AI on Google flavor builds. See ",(0,s.jsx)(n.a,{href:"/docs/software/android/user/app-functions",children:"App Functions"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"ui-differences",children:"UI Differences"}),"\n",(0,s.jsx)(n.p,{children:"The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction."}),"\n",(0,s.jsx)(n.h3,{id:"keyboard-shortcuts",children:"Keyboard Shortcuts"}),"\n",(0,s.jsxs)(n.p,{children:["Shortcuts use ",(0,s.jsx)(n.strong,{children:"\u2318"})," (Command) on macOS and ",(0,s.jsx)(n.strong,{children:"Ctrl"})," on Windows and Linux. (The Super / Windows key is not bound.)"]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Shortcut"}),(0,s.jsx)(n.th,{children:"Action"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"\u2318/Ctrl+Q"})}
1),(0,s.jsx)(n.td,{children:"Quit the application"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"\u2318/Ctrl+,"})}),(0,s.jsx)(n.td,{children:"Open Settings"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"\u2318/Ctrl+1"})}),(0,s.jsx)(n.td,{children:"Switch to Messages tab"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"\u2318/Ctrl+2"})}),(0,s.jsx)(n.td,{children:"Switch to Nodes tab"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"\u2318/Ctrl+3"})}),(0,s.jsx)(n.td,{children:"Switch to Map tab"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"\u2318/Ctrl+4"})}),(0,s.jsx)(n.td,{children:"Switch to Connect tab"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"\u2318/Ctrl+/"})}),(0,s.jsx)(n.td,{children:"Open About"})]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"window--system-tray",children:"Window & System Tray"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Window resizing"})," \u2014 responsive layout adapts to window dimensions"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"System tray"})," \u2014 minimize to system tray for background mesh operation"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Tray menu"})," \u2014 right-click the tray icon to show window or quit"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Mouse interaction"})," \u2014 hover states and standard desktop navigation"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"notification-preferences",children:"Notification Preferences"}),"\n",(0,s.jsxs)(n.p,{children:["The Desktop app provides in-app toggles for controlling which notifications are shown \u2014 messages, new nodes, and low battery alerts. Access these from ",(0,s.jsx)(n.strong,{children:"Settings \u2192 Notifications"})," within the app."]}),"\n",(0,s.jsx)(n.h2,{id:"built-in-documentation-browser",children:"Built-in Documentation Browser"}),"\n",(0,s.jsx)(n.p,{children:"The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Docs browser with table of contents",src:t(95439).A+"",width:"1080",height:"2400"})}),"\n",(0,s.jsx)(n.p,{children:"The browser supports full-text search across all documentation:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Searching the docs browser",src:t(315).A+"",width:"1080",height:"231"})}),"\n",(0,s.jsx)(n.p,{children:"Individual doc pages render with full formatting:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"A documentation page",src:t(99456).A+"",width:"1080",height:"2400"})}),"\n",(0,s.jsx)(n.h2,{id:"building-from-source",children:"Building from Source"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/meshtastic/Meshtastic-Android.git\ncd Meshtastic-Android\n./gradlew :desktopApp:run\n"})}),"\n",(0,s.jsx)(n.p,{children:"Requirements:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"JDK 21"}),"\n",(0,s.jsx)(n.li,{children:"No Android SDK required for desktop-only builds"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"known-limitations",children:"Known Limitations"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"The interactive map view is Android-only \u2014 the Map tab is present but does not render a map on desktop"}),"\n",(0,s.jsx)(n.li,{children:"Some Android-specific features (widgets, specific notification channels) are unavailable"}),"\n",(0,s.jsx)(n.li,{children:"Performance may vary on low-spec hardware running Compose Desktop"}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(o.A,{term:"BLE",definition:"The default wireless connection between a node and a phone client.",routePath:"/docs/terms/",children:"BLE"})," bonding is not yet supported on desktop (pairing works without bonding)"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"related-topics",children:"Related Topics"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"/docs/software/android/user/connections",children:"Connections"})," \u2014 connection methods overview"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"/docs/software/android/user/firmware",children:"Firmware Updates"})," \u2014 ",(0,s.jsx)(o.A,{term:"USB",definition:"The wired connection used to power a device, flash firmware onto it, and communicate with it over serial.",routePath:"/docs/terms/",children:"USB"}),", ",(0,s.jsx)(o.A,{term:"BLE",definition:"The default wireless connection between a no
1de and a phone client.",routePath:"/docs/terms/",children:"BLE"}),", and Wi-Fi update all work the same as on Android"]}),"\n"]}),"\n",(0,s.jsx)(n.hr,{})]})}function u(e={}){let{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},99456(e,n,t){t.d(n,{A:()=>i});let i=t.p+"assets/images/docs-browser_page-18d4d735ee5d63ad99aee8970044ae98.webp"},315(e,n,t){t.d(n,{A:()=>i});let i="data:image/webp;base64,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"},95439(e,n,t){t.d(n,{A:()=>i});let i=t.p+"assets/images/docs-browser_toc-852a9293fb73d5636a93c547aa9909d0.webp"},67008(e,n,t){t.d(n,{R:()=>o,x:()=>d});var i=t(71763);let s={},r=i.createContext(s);function o(e){let n=i.useContext(r);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:n},e.children)}},87622(e,n,t){t.d(n,{A:()=>o});var i=t(71763),s=t(37773),r=t(91987);function o({term:e,definition:n,abbreviation:t,routePath:d="/glossary",children:l}){let[a,c]=(0,i.useState)(!1),[h,u]=(0,i.useState)(null),[p,j]=(0,i.useState)("top"),x=(0,i.useRef)(null),m=(0,i.useRef)(null),w=(0,i.useCallback)(()=>{let e;if(!x.current||!m.current)return;let n=x.current.getBoundingClientRect(),t=m.current.getBoundingClientRect(),i=window.innerWidth,s=window.innerHeight,r=document.querySelector(".navbar"),o=r?r.getBoundingClientRect().bottom:0,d=n.top-o>=t.height+8,l=s-n.bottom>=t.height+8,a=d||!l?"top":"bottom";e="top"===a?n.top-t.height-8:n.bottom+8;let c=n.left+n.width/2-t.width/2;c=Math.max(8,Math.min(c,i-t.width-8)),j(a),u({top:Math.max(o+4,e),left:c})},[]);(0,i.useEffect)(()=>{let e;if(!a)return;let n=requestAnimationFrame(()=>{e=requestAnimationFrame(()=>{w()})}),t=()=>w(),i=()=>w();return window.addEventListener("scroll",t,!0),window.addEventListener("resize",i),()=>{cancelAnimationFrame(n),e&&cancelAnimationFrame(e),window.removeEventListener("scroll",t,!0),window.removeEventListener("resize",i)}},[a,w]);let f=(0,s.P_)("docusaurus-plugin-glossary"),g=(0,i.useMemo)(()=>{if(n&&"string"==typeof n&&n.length>0)return n;let t=(f&&f.terms||[]).find(n=>"string"==typeof n.term&&n.term.toLowerCase()===String(e).toLowerCase());return t&&t.definition?t.definition:void 0},[n,f,e]),v=(0,i.useMemo)(()=>{let n=t;if(!n){let t=(f&&f.terms||[]).find(n=>"string"==typeof n.term&&n.term.toLowerCase()===String(e).toLowerCase());n=t&&t.abbreviation}if("string"!=typeof n)return;let i=n.trim();if(i&&i.toLowerCase()!==String(e).toLowerCase())return i},[t,f,e]),A=(0,i.useMemo)(()=>d&&"string"==typeof d&&d.length>0?d:f&&f.routePath||"/glossary",[f,d]),b=l||e,y=e.toLowerCase().replace(/\s+/g,"-");return(0,r.jsxs)("span",{ref:x,className:"glossaryTermWrapper_ud7W",children:[(0,r.jsx)("a",{href:`${A}#${y}`,className:"glossaryTerm_x2nJ",onMouseEnter:()=>c(!0),onMouseLeave:()=>c(!1),onFocus:()=>c(!0),onBlur:()=>c(!1),"aria-describedby":`tooltip-${y}`,children:b}),g&&(0,r.jsxs)("span",{ref:m,id:`tooltip-${y}`,className:`tooltip_WjgA ${a?"tooltipVisible_AjfD":""} ${"top"===p?"tooltipTop_uMN4":"tooltipBottom_U9P5"} tooltipFloating_nLk7`,role:"tooltip",style:a&&h?{top:`${h.top}px`,left:`${h.left}px`}:void 0,children:[(0,r.jsx)("strong",{children:e}),v?` (${v}). `:"",g]})]})}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.