---
title: Where the unread SMS texts start (the "N new messages" divider)
---
# Where the unread SMS texts start (the "N new messages" divider)

## What it is

### What it does

Open an SMS conversation that has texts you have not read and Omniscio draws a short
accent line with a small accent-tinted pill centered on it, reading **"3 new messages"** (the number is
however many are unread). It sits immediately above the first text you have not read, so
a long thread — a bank sending verification codes, a group that has been going all day —
tells you at a glance where you left off instead of leaving you to guess.

It is the same marker Team Chat has drawn for a long time, deliberately: "where I left
off" reads identically in both places.

### What the number counts

Only texts **they** sent you. Your own messages never count as new, and neither does a
text you have already read — the number is exactly how many incoming texts arrived since
you last read that conversation.

## Where to find it

- In an SMS conversation — the thread you get by tapping a text in the Inbox, or picking a
  conversation from the SMS list.
- It shows on desktop and on the phone/web view, in light and dark themes.

## How it behaves

### When it appears

- When you **open** a conversation that has unread texts.
- It stays in place while you read that conversation — it does not vanish the moment the
  thread opens, which is exactly the moment it becomes useful.

### When it does NOT appear

- **The conversation has nothing unread.** Opening a thread you are already caught up on
  shows no marker.
- **The unread texts are further back than the loaded part of the thread.** Omniscio loads
  the newest messages first; if the unread run starts before that, no marker is drawn
  rather than one that would claim the oldest loaded text is new. Tap **Load earlier
  messages** and open the thread again to bring them into view.
- **You marked the thread read from the Inbox row** without opening it. The marker is
  tied to opening a conversation, so dismissing a row never plants one on a thread you
  never looked at.
- **A spam-filtered conversation.** Those do not carry unread state.

### After you have read it

Move to another conversation and come back, and the marker is gone — that thread is read.
An unread SMS you read on your **phone** is the one case Omniscio cannot see: it learns
about that only when you next reply or mark the thread read here, exactly as with the
unread dot.

### No setting

There is nothing to switch on. It is a display marker, and it is on for every SMS
conversation — the same as Team Chat's.

## For agents

### Where it lives in code

- **The rule** — `src/renderer/src/features/sms/sms-unread-anchor.ts`,
  `computeSmsUnreadAnchorId(messages, unreadCount)`: the id of the message the marker sits
  above, or `null`. Pure and unit-tested on its own.
- **The count** — `unreadAnchor` on the SMS store (`src/renderer/src/stores/sms-store.ts`):
  `{ phoneNumber, count }`, snapshotted in `selectConversation` from the conversation's
  `unreadCount`. It is a snapshot because opening a thread marks it read, which zeroes that
  counter — a live-derived marker would erase itself on the open that made it worth showing.
  Cleared on account switch.
- **The marker** — the memoized `UnreadDivider` inside `SmsViewer.tsx`, rendered just after
  the day separator for the anchored message. Test id `sms-unread-divider`.
- **Deep end** — the thread UI contract
  (`.claude/memory/contracts/sms-chat-ui-contract.md`, invariant `unread-divider-anchor`) and
  the inbox-attention contract (`sms-inbox-attention-contract.md`), which owns what
  `unread_count` means and when it is cleared.

## Related

- Team Chat, which has the same marker: `src/renderer/src/features/team-chat/TeamChatDividers.tsx`
  and `src/shared/team-chat/message-dividers.ts`.
- [SMS via CLI](cli-sms.md) · [Send & receive pictures in SMS](sms-pictures.md) ·
  [Set up SMS integration](set-up-sms-integration.md)
