Messaging

The Messages tab holds conversations: one thread per station, kept in order, with every message showing exactly what happened to it on the air. It works the same whether your packets go out over a radio, over APRS-IS, or both at once.

One thread per station, six kinds

Conversations come in six kinds, and the thread list can filter by any mix of them. It remembers your selection across launches.

  • Direct: conversations with another station, radio to radio.
  • Services: automated bots like WHO-IS or the email gateway. See APRS services.
  • Bulletins: broadcasts to everyone in range, collected into one room per group.
  • SMS: text messages carried by the SMS gateway.
  • Email: Winlink mail you have read, one conversation per sender. Type in one to answer by email. See Winlink.
  • Groups & Nets: rooms carried by ANSRVR, like #APRSThursday. See Groups and nets.

A conversation labelled as N0CALL-10 is one with a station that wrote to one of your other SSIDs rather than to your station callsign. See Your other callsigns.

Thread headers show when the station was last heard and its distance and bearing from you, or "Not heard yet", never a made-up value. Inside a thread you get an unread boundary line, day dividers, and a jump-to-latest button when you have scrolled up.

A station's SSIDs in one conversation

Most operators use more than one SSID: N0CALL at home, N0CALL-7 on a handheld, N0CALL-9 in the car. The app puts all of them in one conversation, headed N0CALL, however many SSIDs the other operator writes from. Whenever a message's SSID is not the one in the header, its run of messages is marked with the SSID it came from (from N0CALL-7) or went to (to N0CALL-9). Tapping a message opens its details, which name the full callsign too.

A reply still goes to one SSID, because a radio or an APRS-IS login on N0CALL-7 only hears messages addressed to N0CALL-7. A line above the message box, Sending to N0CALL-9. Change, says which one. It follows the SSID that wrote to you last, which is the radio the other operator is using now; tap Change to pick another SSID from the conversation, one heard on the air, or the bare callsign. A new message from them sets it back to following whoever wrote last. Message on a station's page opens the same conversation, sending to that station's SSID.

To keep each SSID in a conversation of its own, turn off Settings → Messages → Group a station's SSIDs. It is on by default. Turning it off or on moves the messages already on the device as well as new ones, so it can be switched back at any time; every message keeps the exact callsign it came from. Services are never grouped: WLNK-1 is Winlink's address, not an SSID.

Six delivery states

Every message you send carries one of six states:

State Meaning
Queued Waiting for the channel
Sent Handed to the radio or APRS-IS, but not yet proof it was radiated
Digipeated Your own packet came back through a repeater, which proves it went out over the air
Delivered The recipient acknowledged it
Rejected The recipient explicitly refused it
Not delivered Every attempt failed

Digipeated is confirmed off the air: the app matches its own packet coming back through a digipeater, which is proof it was radiated, not a guess.

With an account, any of your devices can hear it for the one that sent it. If another device signed in to your account hears the acknowledgement, or hears your message repeated, the message is marked on all of them and the device that sent it stops retrying.

Retries, stop, and retransmit

Retries are automatic, and they space themselves out: the first waits one interval, the second two, the third three. At the default 30 seconds that is about 30s, 60s, 90s, 120s, 150s between six transmissions, against a 5-minute ceiling. Each wait also gets up to 5 seconds added at random, so your retries do not keep landing at the same moment as another station's. The last attempt waits its full window for an acknowledgement before the message is marked failed, and the message screen shows that countdown.

Settings → Messages → Retry schedule sets both numbers: the retry interval (10, 30 or 60 seconds) and how many transmissions a message gets in all (3, 6 or 10). Pick 60 seconds and the ladder is about 60s, 120s, 180s. The screen says what the pair adds up to. Only the five-minute ceiling, the few random seconds and the lengthening itself are fixed: APRS has no collision detection, so a client that retries impatiently makes the channel worse for everyone and lowers its own chance of getting through. A change applies to messages already in flight, from their next retry on.

Digipeaters and APRS-IS servers drop a copy of a packet they have already passed in the last 30 seconds. At 10 seconds, the first retries only reach stations that hear you direct; 10 is there for a simplex contact where that is the whole path.

The message screen also lists every copy that went out, each with its time and whether it went by radio, by APRS-IS, or both. The list is read back from the packet log, so copies the log has since pruned are counted rather than listed. Messages still in flight when the app is killed are picked up and resumed on relaunch. Failed messages show a retry button on the bubble itself, and the thread list flags the conversation.

You can stop a message mid-retry, and the app tells you what actually happened: stopped in time, a copy already went out, a digipeater repeated it, or it was already delivered. You can also retransmit any message: a pending one reuses the same wire ID so a late acknowledgement still matches, while an answered one goes out as a new message.

Incoming messages addressed to you are acknowledged automatically. Duplicate retransmissions are acknowledged again but do not re-notify.

Where messages go

With a radio and APRS-IS both connected, every copy of a message goes out on both at the same time. That is the default, and it gives a message the best chance of arriving. Settings → Messages → Where messages go changes it for every message you send:

  • All channels: the default. Every copy on the radio and over APRS-IS at once.
  • RF first: the whole retry schedule on the radio. If nothing acknowledges it, the same schedule runs again over APRS-IS. The message screen counts against both ladders, so six attempts becomes "attempt 7 of 12" when the second begins.
  • APRS-IS first: the same, the other way round.
  • RF only: never over APRS-IS. With no radio connected, the message stays queued with a note on the thread saying so, and goes out when one connects.
  • APRS-IS only: never on the radio. With APRS-IS disconnected, the message waits for it.

Two things the setting does not change. APRS OTA's HOST and QSL only count over the air, so they take the radio whatever is chosen and run one ladder there. And under RF only or APRS-IS only, acknowledgements you send keep to the same link; under the other three they go out everywhere.

If your path includes NOGATE or RFONLY, your messages and acknowledgements stay off APRS-IS under every route, because that is what those words ask for and APRS-IS servers drop such packets anyway. All channels then means the radio alone, and APRS-IS first runs on the radio. Under APRS-IS only a message has nowhere to go, so it stays queued and the thread says why.

This is the setting for a station that runs an igate and hosts APRS OTA ops from the same phone: APRS-IS stays connected for the igate, and RF first keeps your own messages on the air.

Settings → Messages → Send via names the channels messages may use, the way a beacon's Send via does: EVERYWHERE, or the channels you tick, by the names you gave them on the Radio screen. The route above decides the order between radio and APRS-IS; this decides which channels count on each side, so a second APRS-IS session or a KISS TNC on the network can be left out. A named list never falls back: with none of its channels connected, the message waits and the thread says so. Acks use the same list.

Retry when heard

A message usually fails because the other station is not on the air, and pressing Retry an hour later is a guess about when they are back. With APRS Connect Pro, a failed message can wait for its station instead: the app watches for that exact callsign and SSID, and the next time it is heard, over the radio or through APRS-IS, the message goes out again with the same retry schedule and the same wire ID, so a late acknowledgement still matches.

The watch is deliberately spread out. It starts one retry cycle on the first hearing, holds off for an hour after that cycle fails, starts a second on the next hearing after that, holds off for eight hours, and starts a third on the next hearing after that. Three tries in all, and the watch lapses two weeks after it was set, so a station that only switches on for a weekly net still gets one honest try per visit, and a station that beacons every two minutes cannot burn all three in one evening. While a watch is on, the bubble carries a line of its own under the delivery status, such as "Retries when N0CALL-7 is heard · 3 tries left", and the message screen repeats it with the date the watch lapses. The Retry button still works by hand, and Stop waiting in the message's long-press menu ends the watch. Only the final failure notifies; the first two cycles failing are silent, because you asked for the wait. The failure notification carries buttons that act without opening the app: Retry now on every failure, Retry when heard when the app is asking, and Stop waiting when a watch was set for you.

Settings → Messages → Retry when heard decides what happens when a message fails: Ask each time (the default) puts the question on screen if the app is in hand and in the failure notification if it is not, Always sets the watch without asking, and Never leaves the failure alone. Two cases are never watched: a message sent without a message number, which nothing could acknowledge, and a message QRX has already stored for a registered recipient, which QRX will deliver itself. A message whose path says NOGATE or RFONLY listens to the radio alone. On iPhone the app only hears stations while it is open, so a waiting message goes out the next time you open the app after the station is heard.

Waiting to be heard

Watched messages are not only findable inside their own threads. Waiting to be heard lists every one of them on a single screen, reached two ways: a banner at the top of the message list saying how many are waiting, and a Waiting tile in the drawer (swipe up on the tab bar), which wears the same count as a badge and none at all when there is nothing waiting.

Each row names the message, the station it is waiting for, how many tries are left and the date the watch lapses. A row that is inside one of the hold-off periods says when the next try becomes possible, and one being retried at that moment says so. Tapping a row opens the message itself; Stop waiting on the row ends that watch without opening anything.

The 67-byte limit, and templates

APRS messages carry at most 67 bytes, and the compose box counts down against that limit as you type. Longer text is split into parts automatically, and a multi-part send reports the state of its least-delivered part. It does not claim delivery until every part made it.

Messages in parts

A message that went out in parts is shown as one message, with the counters such as (1/2) taken out. That goes for the messages you send and the ones you receive. A received message counts as parts when each one has a counter such as (1/2), 1/2 or [1/2] at its start or end.

Under the words, a message you sent shows one status line for the whole message, the state of the part that has got least far. Tap 3 parts (or however many there are) to open a line for each part, with that part's time and delivery state. A part that was not delivered opens the lines by itself, with RETRY on that part. On a message you received, 3 parts opens a small tab for each part with the time it arrived. Tap a part's line or tab to open its detail, with its path and raw packet, or long-press it for that part's own menu. Long-press the words for the menu of the whole message: Copy text copies all of it, Delete message removes every part, and Stop sending stops every part still going out.

Parts that arrive out of order are put back in order, and a part that has not arrived is marked where it belongs. Parts are only joined while nothing else has been said in between. A part that arrives after your reply, or after another message from the same station, is shown on its own with its counter, as it arrived. So is a single part whose other parts have not come.

A received message in parts gives one notification. The first part to arrive alerts as usual, and the parts after it fill in the same notification without a sound or a banner. If you have already read or cleared that notification, the next part alerts again, so nothing arrives unannounced. On Android the quiet updates use a notification category of their own, Later parts of a message. In the desktop app the first part's notification stays as it was.

This is on by default. To see every part as a message of its own, with its counter, turn off Settings → Messages → Show messages in parts as one. Every part is kept as it arrived either way, so it can be switched back at any time.

Long messages

Some stations can send and receive up to 200 characters in one message. The app always shows a long message it receives in full. It can also send them. This is off by default, because some radios cut a long message off at 67 characters and still acknowledge it.

Settings → Messages → Long messages has three choices:

  • Off (the default): messages over 67 characters are split into parts.
  • Automatic: a station gets long messages after it has sent you one. Each SSID is counted separately, so a long message from N0CALL-10 does not turn it on for N0CALL-7.
  • Always: every station gets long messages.

To choose for one station, open its conversation and pick Long messages to … from the ⋯ menu, then Use global default, On for this station or Off for this station. That choice is used instead of the one in Settings, and the stations chosen this way are listed under the setting.

While long messages are on in a conversation, a line above the compose box says so and the countdown starts at 200. Text over 200 characters is still split, into parts of up to 200.

Services such as the SMS gateway, APRS OTA and ANSRVR always get messages of 67 characters.

Message templates save typing on a small keyboard, in four groups: Everyday, POTA / SOTA, Nets, and Emergency.

A web address in any message is underlined, and tapping it opens your browser. That goes for your messages and theirs, in a thread, a net room, or a service reply. Addresses with https:// or www. in front are always recognised; a bare address such as aprs.fi/info/a/N0CALL is recognised when it ends in a common domain. Long-press still opens the message menu, and Copy text still copies the whole message.

Missed messages

When the app is closed, the device is switched off or out of signal, or an iPhone has paused the app in the background, a message sent to you can go by unheard. aprsconnect.com hears every message on APRS-IS, so it covers that gap:

  • A notification. The app tells aprsconnect.com whether it is listening. While it is away (closed, switched off, or an iPhone with the app in the background), a message to your callsign, or to one of your other callsigns, notifies this device straight away. While it is listening, the app tells aprsconnect.com about each message it hears, and is only notified about one it did not hear within about 30 seconds. Each device decides for itself: another app, a radio or your other device on the same callsign having the message does not stop this one being told, the way two email apps on one phone both notify.
  • The message in its conversation. When the app comes back, and every few minutes while it is running, it collects what it missed and adds each message to its conversation, marked via server, and acknowledges it. A message more than a day old is added without an acknowledgement, and so is one that another app or radio on your callsign already acknowledged.
  • Acknowledgements for what you sent. When you send over radio with no APRS-IS connection, an acknowledgement sent back over the internet may never reach your radio, and the app would keep sending the message. While a message is waiting, the app asks aprsconnect.com every few seconds whether the other station acknowledged it. If it did, the message shows as delivered and the app stops sending it.

It reaches back up to 14 days, but never to before this device took a callsign: after you change your callsign, or add one of your other callsigns, messages sent to it earlier are not added. It only sees messages that reach APRS-IS: a message sent over radio that no IGate heard cannot be seen. Muted conversations and nets, and blocked stations, never notify, but their messages are still added.

It is on by default. To turn it off, use Settings → Messages → Missed messages. When it is off, the server forgets your callsigns and nothing is added.

Your recent conversations on a new install

When you set up the app for the first time and enter your callsign, it brings in the last 14 days of messages to and from that callsign, from whatever app you used before. Nothing notifies and nothing is acknowledged. A message to you that asked for an acknowledgement and never got one arrives unread; everything else arrives read. Messages you sent show Sent from another app, delivered if the other station's acknowledgement was seen, or No ack seen if it was not (it may still have been acknowledged over radio). This happens once, on a new install, and only while Missed messages is on.

Search, mute, archive, block, delete

Search covers every message ever stored, with matches highlighted and inbox and archive results kept separate. Per thread you can:

  • Mute: keeps receiving and stays in the list, but stops notifying. Muted threads still keep their unread count.
  • Archive: hidden from the main list, kept in full. A new message brings it back; archived threads live under More → Archived.
  • Block: their messages stop reaching your inbox and stop being acknowledged. APRS is a shared channel, so their packets are still received and stay in the packet log and on the map. In a conversation that holds several SSIDs of a station, every SSID in it is blocked. An SSID of theirs you hear for the first time afterwards is not; block it from its own conversation.
  • Delete conversation: removes every message in it from this device. The packets themselves were transmitted in the clear and remain in everyone else's logs.

Bulletins

Bulletins are collected into one room per group, with each one attributed to the station that sent it. You can post your own: a general bulletin, or one addressed to a group such as WX, a club or an event.

Asking a station where it is

From any station's page you can send the standard ?APRSP position query. The request is tracked like any message, and the answer arrives as a fresh position on the map, not as a chat bubble.

Answering station queries

Other stations can send yours a query: a short message your station answers by itself. The switches, and a record of every query received and what became of it, are under Settings → Privacy → Station queries.

  • ?APRSP asks where you are. It gets one ordinary beacon, position blur included. The switch, Answer position queries, is off by default.
  • ?APRSS asks for your status. It gets your station beacon's comment, sent as a status report. With no comment there is nothing to send, and it is not answered.
  • ?APRST (or ?PING?) asks how the query reached you. It gets a message listing the path it took, including the IGate that carried it when it came over APRS-IS.
  • ?IGATE asks whether you are an IGate. While your IGate is on, it gets how many messages the IGate has sent on the radio and how many stations it hears directly.

The last three share one switch, Answer other queries, which is on by default. Each answer is one packet. Answers are rate limited: one per station per query every five minutes, and never two within 30 seconds. A query sent to one of your other callsigns is recorded but never answered.

Composing: radio and every gateway in one place

The New message screen covers every network from one place: radio, plus the SMS, email, Winlink and WhatsApp gateways, with per-channel validation and recipient formats. Callsign suggestions come only from stations actually heard.

For SMS, note that texts go out in the clear over APRS, and both phone numbers must be registered at aprs.wiki first. You can give an SMS conversation a local name on your phone, or save the number as an alias on the gateway itself so it works from any radio you use. The gateways are covered in more detail in APRS services.

On Android, message notifications arrive on a notification channel of their own, so APRS can be silenced independently of everything else. See Background and battery for receiving while the screen is off.

Last updated 30 September 2026