Skip to content

feat(tak): let a channel send ATAK messages without the callsign - #1296

Merged
rinchen merged 4 commits into
Colorado-Mesh:mainfrom
RobertMTalbot:feat/tak-callsign-toggle
Oct 20, 2026
Merged

rinchen merged 4 commits into
Colorado-Mesh:mainfrom
RobertMTalbot:feat/tak-callsign-toggle

Conversation

@RobertMTalbot

@RobertMTalbot RobertMTalbot commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

Why

Every message an ATAK device sends to a channel goes out as [CALLSIGN] text. A bot looks for its command at the start of the message, so it never answers a command sent from ATAK (found testing #bot through the TAK server).

What

  • Add callsign checkbox per sending channel, next to ATAK can send, on by default. Off, what ATAK sends goes out exactly as typed. Kept by channel key (noCallsignChannels in the TAK relay prefs), like the channel's other settings; earlier saved settings read as all on. Direct messages keep the callsign.
  • A hint under the channel list says what it is for. Settings search finds it under "callsign" and "bot".
  • Echo guard: it remembered each send and dropped the same text heard on that channel within 2 minutes. MeshCore never hears its own sends, so the entry stayed, and another node's identical !ping would have been dropped. Now only a message that could be this radio's own is dropped: MeshCore channel messages and Meshtastic messages from another node are always passed on.

Tests

New tests for the setting, the bare send next to a prefixed one on another radio, the checkbox, and another node's matching message getting through.

🤖 Generated with Claude Code

https://claude.ai/code/session_01EHFPfW7vZXpRdR3tBBTX3r

Summary by CodeRabbit

  • New Features
    • Configure whether each served channel includes the sender’s callsign on TAK-originated messages. Callsigns remain enabled by default, and channel settings provide guidance for configuring bot channels.
  • Bug Fixes
    • Improved channel relaying so messages from other nodes can be forwarded without being mistaken for echoes of messages sent by this radio.

RobertMTalbot and others added 2 commits October 18, 2026 16:41
Every message an ATAK device sends to a channel goes out as
"[CALLSIGN] text", so a bot, which looks for its command at the start of
the message, never answers one sent from ATAK.

Each sending channel now has an Add callsign checkbox, on by default.
With it off, the message goes out exactly as typed. It is kept by channel
key, like the channel's other settings. Direct messages keep the callsign.

A bare send such as "!ping" is text another node may well send too, so
the echo guard now only drops a message that could be this radio's own
send heard back: MeshCore never hears its own, and Meshtastic's are from
this radio's node.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EHFPfW7vZXpRdR3tBBTX3r
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EHFPfW7vZXpRdR3tBBTX3r
@github-actions github-actions Bot added the enhancement New feature or improvement request label Oct 18, 2026
@coderabbitai

coderabbitai Bot commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Important

Review skipped

Review was skipped as selected files did not have any reviewable changes.

⛔ Files ignored due to path filters: 16
  • src/renderer/locales/cs/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/de/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/en/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/es/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/fr/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/id/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/it/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/ja/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/ko/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/nl/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/pl/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/pt-BR/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/ru/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/tr/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/uk/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/zh/translation.json is excluded by !src/renderer/locales/**
⚙️ Run configuration
  • Configuration used: Repository: Colorado-Mesh/mesh-client/.coderabbit.yaml
  • Review profile: QUIET
  • Plan: Advanced
  • Run ID: b9369562-9ea6-4631-a7ea-14534588850f
📥 Commits

Reviewing files that changed from the base of the PR and between 6c2d228 and 017adc4.

⛔ Files ignored due to path filters: 16
  • src/renderer/locales/cs/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/de/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/en/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/es/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/fr/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/id/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/it/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/ja/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/ko/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/nl/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/pl/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/pt-BR/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/ru/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/tr/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/uk/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/zh/translation.json is excluded by !src/renderer/locales/**

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository: Colorado-Mesh/mesh-client/.coderabbit.yaml
  • Review profile: QUIET
  • Plan: Advanced
  • Run ID: 36b8ac24-b9f1-4ce2-8317-eb1d62b1717e
📥 Commits

Reviewing files that changed from the base of the PR and between 14fb3d8 and bddd5e4.

⛔ Files ignored due to path filters: 16
  • src/renderer/locales/cs/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/de/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/en/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/es/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/fr/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/id/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/it/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/ja/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/ko/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/nl/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/pl/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/pt-BR/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/ru/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/tr/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/uk/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/zh/translation.json is excluded by !src/renderer/locales/**
📒 Files selected for processing: 13
  • src/renderer/components/TakChannelRelaySection.test.tsx
  • src/renderer/components/TakChannelRelaySection.tsx
  • src/renderer/hooks/useTakInboundChat.test.tsx
  • src/renderer/lib/ingest/meshcoreIngest.ts
  • src/renderer/lib/settingsSearchEntries/tak.ts
  • src/renderer/lib/tak/takChannelRelay.test.ts
  • src/renderer/lib/tak/takChannelRelay.ts
  • src/renderer/lib/tak/takInboundChat.test.ts
  • src/renderer/lib/tak/takInboundChat.ts
  • src/renderer/lib/tak/takServedChannels.test.ts
  • src/renderer/lib/tak/takServedChannels.ts
  • src/renderer/stores/takRelayPrefsStore.test.ts
  • src/renderer/stores/takRelayPrefsStore.ts

Included review availability: This review used your included allowance. Your plan provides up to 2 included reviews per hour; 1 remain after this review.

📝 Walkthrough

TAK channel relay preferences now support disabling callsign prefixes per channel. Outgoing messages use each channel’s setting. Meshtastic relay messages also carry origin information that affects matching-send echo checks.

Changes: Per-channel callsign control

Layer / File(s) Summary
Store and expose callsign preferences
src/renderer/stores/takRelayPrefsStore.ts, src/renderer/stores/takRelayPrefsStore.test.ts, src/renderer/lib/tak/takServedChannels.ts, src/renderer/lib/tak/takServedChannels.test.ts, src/renderer/components/TakChannelRelaySection.tsx, src/renderer/components/TakChannelRelaySection.test.tsx, src/renderer/lib/settingsSearchEntries/tak.ts, src/renderer/hooks/useTakInboundChat.test.tsx
The preference store validates and updates noCallsignChannels. Served-channel data exposes the callsign setting, and the relay section shows a callsign checkbox and hint.
Format outgoing messages per channel
src/renderer/lib/tak/takInboundChat.ts, src/renderer/lib/tak/takInboundChat.test.ts
Send targets carry a callsign setting. Relay formatting applies it per target while preserving text trimming and byte-budget behavior.

TAK channel echo handling

Layer / File(s) Summary
Distinguish other-node messages
src/renderer/lib/tak/takChannelRelay.ts, src/renderer/lib/tak/takChannelRelay.test.ts, src/renderer/lib/ingest/meshcoreIngest.ts
Meshtastic channel relays mark messages from another node. The echo guard uses this origin information when checking matching sends.

Priority: ➖ Normal

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Feature

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant TakChannelRelaySection
  participant takRelayPrefsStore
  participant servedChannelsFor
  participant relayTakChatToMesh
  participant MeshRadio
  User->>TakChannelRelaySection: Disable callsign for a channel
  TakChannelRelaySection->>takRelayPrefsStore: Update channel callsign preference
  relayTakChatToMesh->>servedChannelsFor: Read channel callsign setting
  servedChannelsFor-->>relayTakChatToMesh: Return callsign flag
  relayTakChatToMesh->>MeshRadio: Send formatted channel message
Loading

Suggested reviewers: rinchen

Merge Risk: ⚪ Minimal · up to bddd5

This change adds a per-channel option to omit the callsign from ATAK-to-mesh messages and refines echo handling for messages from other nodes. No concrete merge-blocking risk was identified.

Pre-merge checks: Passed 5
Check name Status Explanation
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed The title clearly and concisely describes the main change: allowing a TAK channel to send ATAK messages without the callsign.
Docstring Coverage Passed Docstring coverage is 90.00% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 10 functions across 13 files.
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@rinchen
rinchen merged commit 97a86fb into Colorado-Mesh:main Oct 20, 2026
22 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or improvement request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants