---
title: Instant SMS taps in the inbox (preload)
---
# Instant SMS taps in the inbox (preload)

## What it is

### What it does

On the **phone / web view**, tapping an SMS conversation in your inbox used to
show grey "loading" placeholders (a shimmer) for about half a second to a second
before the messages appeared. That wait is a real network round-trip: your phone
reaches Omniscio over the Tailscale tunnel, so every tap fetches the conversation
across the network. (On the desktop app the messages come straight from the local
database, so it was always instant.)

To kill that shimmer, Omniscio now **preloads the most-recent inbox SMS conversations
in the background** while you're looking at your inbox — quietly, over idle
moments — and **keeps a copy** of each one once loaded. When you then tap a
conversation, its messages are already there and paint **instantly**; no shimmer.

It's the SMS cousin of the session **[pre-render inbox sessions](inbox-prerender.md)**
and **[lazy content load](lazy-content-load.md)** features, and of the
drip-image prefetch — same idea (warm the visible inbox into a cache so opening is
instant instead of a cold fetch).

## Where to find it

Nothing to open or configure: this is what tapping an SMS conversation in the inbox does on the phone and web view.

## How it behaves

### When it applies

- **Phone / web only.** The desktop app is already instant (the database is
  local), so nothing runs there — no wasted background work or mobile data.
- **Only the conversations in your Inbox** — the SMS threads flagged as needing
  your attention. It reuses the _exact same rule_ the Inbox itself uses, so the
  preloaded set is precisely what you see in the Inbox — never your whole message
  history. Archived, snoozed, and dismissed threads are not preloaded.
- **Only the most-recent 10** of those, fetched a bit apart (staggered) so a full
  inbox never fires a burst of requests at once. In practice your Inbox usually
  holds a handful of SMS, so 10 covers them all.
- **Only while you're in the inbox or the SMS panel** — the two places you'd tap
  an inbox SMS from. It doesn't preload while you're elsewhere in the app.

### When it does NOT apply

- **On the desktop app** (already instant).
- If you tap a conversation **before its preload finished** — it simply falls back
  to the old behavior (a brief shimmer while it fetches). No regression, only
  upside.
- Threads **beyond the most-recent 10**, or ones that aren't in your Inbox.

### Freshness and safety

- **Always fresh.** A preloaded copy still refreshes in the background when you
  open it, new incoming texts land in the copy even before you open it, and your
  just-sent replies are written into it — so you never see a stale thread.
- **No cross-account leak.** The copies are wiped when you switch or log out of
  accounts, and a preload that finishes _after_ a switch is discarded — so one
  account can never briefly show another's messages.

### No setting

This is a transparent speed-up — there is **no toggle**. It only runs on the
web/mobile client, only for inbox threads, and is bounded to 10, so it stays cheap
by design. (An internal `AMC_DISABLE`-style guard exists for developers, but there
is nothing for you to configure.)

## For agents

### Where it lives in code

- [src/renderer/src/features/dashboard/sms-prefetch.ts](../../src/renderer/src/features/dashboard/sms-prefetch.ts)
  — `selectSmsPrefetchTargets(...)` (the most-recent-10 inbox picker, `MAX_SMS_INBOX_PREFETCH`)
  and `shouldRunSmsPrefetch(...)` (the web/mobile + inbox-only + configured gate).
- [src/renderer/src/features/sms/useSmsConversationPrefetch.ts](../../src/renderer/src/features/sms/useSmsConversationPrefetch.ts)
  — the idle-scheduled, staggered prefetch hook.
- [src/renderer/src/stores/sms-store.ts](../../src/renderer/src/stores/sms-store.ts)
  — the per-conversation `messageCache`, the cache-hit-paints-instantly
  `selectConversation` (with background revalidate), `prefetchConversation`, and the
  account-switch cache clear in `resetSmsStore`.
- [src/renderer/src/features/dashboard/Dashboard.tsx](../../src/renderer/src/features/dashboard/Dashboard.tsx)
  — mounts the hook next to the session attention-prefetch.

The full engineering contract (test-locked invariants + safe-change checklist) is
[.claude/memory/contracts/sms-inbox-preload-contract.md](../../.claude/memory/contracts/sms-inbox-preload-contract.md).

## Related

- [set-up-sms-integration.md](set-up-sms-integration.md) — how the SMS integration works.
- [inbox-prerender.md](inbox-prerender.md) — the session equivalent (instant switch into needs-you sessions).
- [lazy-content-load.md](lazy-content-load.md) — instant first cold-mount of a long session.
