Apple iOS, iPadOS & macOS Clients For Meshtastic
  • Swift 92.9%
  • HTML 3.9%
  • Shell 2.4%
  • PowerShell 0.4%
  • Python 0.2%
  • Other 0.2%
Find a file
Garth Vander Houwen 0422cb52cd
fix: stop SwiftData SIGTRAP in node list rows and message relay display (#2027)
* fix: stop SwiftData SIGTRAP in node list rows and message relay display

The node-list rows remained the top crash on the current App Store
release (Error Tracking issue ab285602 — SIGTRAP in NodeListItem.swift,
faulting on the NodeInfoEntity.user / UserEntity.userNode relationship
accessors), with message relay display close behind
(MessageEntityExtension.swift). #1991 guarded the row bodies with
`modelContext != nil && !isDeleted` and snapshotted position/metrics,
but the bodies still read `node.user?...` and many `node.*` persisted
properties directly on every re-evaluation. `isDeleted` does not catch a
model invalidated by a bulk delete or a delete on another context
(clearStaleNodes / clearDatabase / live ingestion): the instance reads
`isDeleted == false` while its backing row is gone, so a retained List
row that re-evaluates before the List drops it reads a zombie @Model and
SwiftData fatally traps.

Fix: render the rows from a value-type snapshot captured while the node
is live, so a re-evaluation after the model dies never touches the live
object.

- NodeListRowSummary now captures the full row (name/short name, key
  status, role, favorite, signed, status message, last heard, online,
  hops, snr/rssi, channel, mqtt, store-forward, battery, position, log
  availability) as plain values. NodeListItem/NodeListItemCompact
  memoize one in @State and render from it; the live node is read only
  on first appearance (while valid) and in a guarded refresh keyed to
  lastHeard. No relationship reads remain on the re-evaluation path.
- MessageEntityExtension.relayDisplay() guards `self` liveness before
  reading, filters the fetched users to live ones, and reads the
  userNode relationship through a new `UserEntity.liveUserNode` that
  returns nil for a deleted/zombie user instead of trapping.

Verified: builds for simulator and Mac Catalyst; launched with 5,000/250
seeded nodes in both standard and compact density with no crash and no
visual change to the rows.

* fix: address CodeRabbit review on #2027

- Gate the .task(id:) identity on node liveness in NodeListItem and
  NodeListItemCompact: the id expression reads node.lastHeard during body
  construction, which could fault on an invalidated model before the task
  body's guard runs. Read lastHeard only when the node is still live.
- Fix the relay-name selection comparator in MessageEntityExtension: the
  min(by:) closure returned false whenever either side's hopsAway was nil,
  which isn't a strict weak ordering and let a nil-hops user win by array
  position. Filter to rankable (non-nil hops) candidates before min, and
  fall back to the first match when none have hops.
2026-07-04 07:36:23 -07:00
.claude/skills feat: lockdown mode — spec + protobufs bump + coordinator foundation (#1779) 2026-07-02 23:29:24 -07:00
.github feat: lockdown mode — spec + protobufs bump + coordinator foundation (#1779) 2026-07-02 23:29:24 -07:00
.skills/design-audit Add GitHub Action to sync design standards and design-audit skill (#1718) 2026-05-16 18:35:35 -07:00
.specify feat: lockdown mode — spec + protobufs bump + coordinator foundation (#1779) 2026-07-02 23:29:24 -07:00
.standards Add GitHub Action to sync design standards and design-audit skill (#1718) 2026-05-16 18:35:35 -07:00
.vscode Reduce nested NavigationStacks in filter sheets (#1882) 2026-05-23 17:51:05 -07:00
ci_scripts ci: fail the build when an archive can't upload dSYMs (#1925) 2026-06-11 16:14:02 -07:00
docs feat(map): Precise Locations Only filter for the mesh map (#2031) 2026-07-04 07:36:02 -07:00
itak-example-data-package 2.7.8 Working Changes (#1589) 2026-02-13 16:06:29 -08:00
Meshtastic fix: stop SwiftData SIGTRAP in node list rows and message relay display (#2027) 2026-07-04 07:36:23 -07:00
Meshtastic Watch App Add wifi_threshold and ble_threshold fields to Paxcounter Config (#1846) 2026-05-20 23:55:17 -07:00
Meshtastic.xcodeproj feat: geofence support on waypoints (circle + bounding box) (#2001) 2026-07-03 08:59:50 -07:00
Meshtastic.xcworkspace feat(map): native MapKit map + offline Protomaps basemap + trace routes with 3D flyover (#2008) 2026-06-29 10:54:02 -07:00
MeshtasticProtobufs feat: geofence support on waypoints (circle + bounding box) (#2001) 2026-07-03 08:59:50 -07:00
MeshtasticTests Remove camelCaseToWords channel name display helper (#2029) 2026-07-04 07:35:34 -07:00
protobufs@06d729a1eb feat: geofence support on waypoints (circle + bounding box) (#2001) 2026-07-03 08:59:50 -07:00
scripts chore: pin protoc-gen-swift to the project's swift-protobuf in gen_protos.sh (#1981) 2026-06-22 23:31:34 -07:00
Settings.bundle Add Traditional Chinese (Taiwan) localization (#1998) 2026-07-03 08:15:08 -07:00
specs feat(discovery): allow Analyze Current Preset to run without a connected radio (#2028) 2026-07-03 19:46:43 -07:00
Widgets Convert from CoreData to SwiftData (#1668) 2026-05-03 11:27:07 -07:00
.gitignore feat: redesign onboarding flow with colored icons, toggles, and new screen order (#1938) 2026-06-17 19:01:00 -07:00
.gitmodules Add back submodule 2024-05-01 19:55:39 -07:00
.swiftlint-precommit.yml Transports Interface to Support TCP for all Platforms and Serial on Mac (#1341) 2025-08-27 08:09:02 -07:00
.swiftlint.yml Transports Interface to Support TCP for all Platforms and Serial on Mac (#1341) 2025-08-27 08:09:02 -07:00
CLAUDE.md feat: lockdown mode — spec + protobufs bump + coordinator foundation (#1779) 2026-07-02 23:29:24 -07:00
CONTRIBUTING.md Update references to GitLab to GitHub instead 2025-03-22 15:29:26 -04:00
LICENSE Create LICENSE 2022-01-24 04:53:59 -08:00
Localizable.xcstrings feat: geofence support on waypoints (circle + bounding box) (#2001) 2026-07-03 08:59:50 -07:00
meshtastic-1080x1080.png Update readme 2022-11-19 11:12:40 -08:00
pr-description.md Docs pre-release cleanup + fix documentation translation pipeline (#1963) 2026-06-18 23:38:29 -07:00
README.md Update What's New sections with all 2026 features (#1836) 2026-05-17 21:02:39 -07:00
RELEASING.md Docs pre-release cleanup + fix documentation translation pipeline (#1963) 2026-06-18 23:38:29 -07:00
test-bellevue-bbox.geojson Map tab: MKMapView migration + offline Protomaps basemap & downloads (2.7.16) (#1989) 2026-06-28 17:53:36 -07:00

Meshtastic Apple

iOS · iPadOS · macOS · watchOS · visionOS
Open-source LoRa mesh networking for Apple platforms

Docs CI License: GPL v3 Swift 6 Platforms

User GuideDeveloper GuideGetting StartedLicense


Overview

SwiftUI client applications for iOS, iPadOS, macOS, visionOS and watchOS that communicate with Meshtastic LoRa mesh radio devices over Bluetooth, TCP, and serial.

Key Features

  • Mesh messaging — channel and direct messages over LoRa, with CarPlay and Siri support for hands-free use while driving
  • Live map — node positions, waypoints, and GeoJSON overlays with offline tile support
  • Node management — signal meter, device roles, encryption status, trace routes, and telemetry
  • Full radio configuration — LoRa, channels, security, Bluetooth, device, display, network, position, power, and all module configs
  • Apple Watch companion — node list and fox hunt compass on your wrist
  • TAK integration — CoT position relay and TAK server connectivity
  • In-app documentation — full offline help browser with dark-mode support and AI-powered search (iOS 26+)

What's New

For Users

  • May 2026Docs Translation Pipeline — Community-sourced translations: each device contributes on-device translations that are shared via a CDN feed so future users get instant localized docs.
  • May 2026Automatic Docs Translation — On iOS 26+, in-app documentation is automatically translated into your device language using the Apple Translation framework.
  • May 2026Message Formatting Toolbar — Markdown formatting toolbar in the message compose UI (iOS 18+/macOS 15+). Apply bold, italic, strikethrough, code, and links with one tap; live preview shows rendered output before sending.
  • May 2026Node List Layout — Switchable Complete and Compact density modes for the node list. Compact mode reduces row height for large meshes (100+ nodes) with configurable detail toggles.
  • May 2026Signal Meter — New deep-dive page explaining how the LoRa signal quality meter works, why negative SNR values are normal, and how to interpret RSSI vs. SNR for your mesh.
  • May 2026Apple Watch App — New page covering the companion watch app: node list, fox hunt compass, and how it syncs with your iPhone.
  • Apr 2026Local Mesh Discovery — A diagnostic tool that cycles through multiple LoRa modem presets to audit the local RF environment, collecting nodes and telemetry across presets with configurable dwell times.

For Developers

  • May 2026Testing — Snapshot test conventions established: consolidated multi-state views into single combined images (light + dark pairs), use assertViewSnapshot helper with explicit width/height and transparent: true for icon snapshots.
  • May 2026Architecture — In-app documentation system added: markdown source under docs/ is converted to HTML by scripts/build-docs.sh and bundled at Meshtastic/Resources/docs/. Navigation is driven by index.json.
  • May 2026App Docs (Jekyll + In-App) — Full offline documentation system: markdown source under docs/, GitHub Pages Jekyll site, in-app WKWebView browser with dark-mode support, and AI-powered search via Foundation Models (iOS 26+).

Getting Started

  1. Clone the repo.
    git clone git@github.com:meshtastic/Meshtastic-Apple.git
    
  2. Open the local directory.
    cd Meshtastic-Apple
    
  3. Set up git hooks to automatically lint the project when you commit changes.
    ./scripts/setup-hooks.sh
    
  4. Open Meshtastic.xcworkspace
    open Meshtastic.xcworkspace
    
  5. Build and run the Meshtastic target.

See docs/developer/contributing.md for code style, branch naming, PR checklist, and all other contribution guidelines.

Documentation

Resource Link
User Guide https://meshtastic.github.io/Meshtastic-Apple/
Developer Guide https://meshtastic.github.io/Meshtastic-Apple/developer.html
In-app Settings → Help & Documentation

Release Process

For more information on how a new release of Meshtastic is managed, please refer to RELEASING.md.

License

This project is licensed under the GPL v3. See the LICENSE file for details.


meshtastic.org · GitHub @meshtastic