+++
title = "Chat"
weight = 5
+++

Selecting a contact opens the chat view with the message history.

## Sending Messages

Type your message in the input field and press Enter or click the send button. An emoji picker is available via the smiley button.

A character counter shows bytes used vs. the maximum (156 bytes for direct messages). The send button is disabled if the message exceeds the limit. Note that the limit is in bytes, not characters -- emoji and non-ASCII characters use more bytes.

## Message Status

Outgoing messages show a status indicator:

| Symbol | Meaning |
|--------|---------|
| `Sending` | **Pending/Sent** -- the message is being sent or waiting for acknowledgment from the recipient |
| `✓` | **Delivered** -- the recipient has acknowledged receipt |
| `✗` | **Failed** -- all delivery attempts were unsuccessful |

While the message is in the sending/pending state, the status also shows the routing method (`path`, `direct`, or `flood`) and, on retries, the attempt number (e.g., `(2/5) -- path`). If the radio channel is busy, you may see `waiting Xs (radio busy)` before the message is transmitted.

When delivered, the status shows the round-trip time (e.g., `✓ 1.2s`). If delivery is confirmed after the message was already marked as failed (a late acknowledgment within 30 seconds), it shows the trip time with a late marker (e.g., `✓ 1.2s (late)`) or just `✓ late` if the trip time is unknown.

## Message Retry and Routing

Meshy automatically retries failed deliveries using the routing strategy configured for each contact -- either **Classic** (single path with flood fallback) or **Smart** (automatic selection from a pool of known paths). See the [Routing](@/guide/routing.md) page for full details on how each strategy works and how to configure it.

## Duplicate Message Filtering

In mesh networks, a message can arrive more than once -- for example, when your contact's device reports the message as undelivered (no acknowledgment received) and the contact manually resends it, even though the original was actually received on your end.

Meshy automatically filters these duplicates in **direct chats** (not in rooms or channels). An incoming message is considered a duplicate and silently dropped when:

1. It has the **exact same timestamp and text** as a message already received from the same contact (catches retransmissions that bypass firmware-level deduplication), or
2. It has the **same text** as the **last incoming message** from that contact, that message is **less than 30 minutes old**, and **you have not sent any reply** since.

The second rule is based on the assumption that if your contact sees a message as undelivered, they will not send a new message -- they will resend the failed one. If you have replied in the meantime, the conversation has moved forward and an identical message is treated as a new response.

**Limitations:** In rare cases, a legitimate message may be filtered -- for example, if a contact intentionally sends the exact same text twice within 30 minutes and you have not replied between the two. This filtering only applies to direct contact chats; rooms and channels are not affected.

## Room Messages

Messages in room chats show the sender's name above the message bubble. The sender is resolved from your contact list when possible; otherwise, the sender's key prefix is shown.

## Message Actions

Right-click or long-press an outgoing message for:

- **Send Again** -- re-send the message with a fresh retry cycle.
- **Delete** -- remove the message from the chat and storage.
