# feat\(mobile\): show when an existing thread has a message waiting in the outbox · PR \#10405 · pingdotgg/t3code

[View on GitCafe](https://git.cafe/pingdotgg/t3code/pull/10405)

Repository: [pingdotgg/t3code](https://git.cafe/pingdotgg/t3code)

Visibility: public

State: merged

Source repository: pingdotgg/t3code

Source branch: t3code/queued-thread-indicator

Target branch: t3code/queue-with-uploads

Head commit: a177efd3104cd7f86937636bdf8fc12d366e31b5

[Discussion and reviews](https://git.cafe/pingdotgg/t3code/pull/10405)

[Commits](https://git.cafe/pingdotgg/t3code/pull/10405/commits?format=markdown)

[Files changed](https://git.cafe/pingdotgg/t3code/pull/10405/diffs?format=markdown)

## Description

---

Stacked on [#10404](https://github.com/pingdotgg/t3code/pull/10404).

Existing threads with messages in the mobile outbox were invisible from the thread list, and settled threads could remain hidden in history. Show a 12-point outbox icon beside the normal status or timestamp, without adding a pill, subtitle, count, or row height. The icon remains visible while a thread is working, awaiting approval/input, or showing an error.

Both the default and legacy lists use the same icon, including Home and the iPad sidebar. Screen readers announce queued messages. Android maps the SF Symbol to its upload icon. The outbox-derived thread keys keep settled threads active, retain older threads in the legacy list, and keep reorder planning in sync. Delivery or deletion removes the indicator.

The icon describes this device's unsent outbox. Once connected, messages can send while an agent is working and steer the turn; this does not indicate a provider-side queue or promise to wait until the turn finishes.

Verification: 82 focused tests passed across `threadListV2.test.ts`, `homeThreadList.test.ts`, and `thread-order.test.ts`. Mobile typecheck passes. Targeted lint reports only two existing dependency warnings in `thread-list-v2-items.tsx`.

These iPhone 17 Pro screenshots render the actual native row components with controlled fixtures: idle, working, approval, input, and failed with queued messages, then working and idle without queued messages. They verify presentation, not end-to-end delivery. Android and iPad were checked in code, not on a device. Before is the original text indicator in this PR; after is the compact icon.

| Default list: before | Default list: after |
| --- | --- |
| ![Before: text on idle rows and no queue indicator alongside live states](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7657479c9256d651/t3-queue-icons-before.png) | ![After: outbox icon alongside timestamps and every live status](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c3d38ed266a865ee/t3-queue-icons-after.png) |

| Legacy list: before | Legacy list: after |
| --- | --- |
| ![Before: Pending pill and Sends on reconnect subtitle](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2f27be9621e23341/t3-queue-icons-legacy-before.png) | ![After: small outbox icon with no queue pill or subtitle](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d19af50bbc9e230b/t3-queue-icons-legacy-after.png) |

Model: GPT-6 · Harness: Codex in T3 Code

