RESEARCH: mail thread design, newest first (descending) — best designs, proposals, grill questions (NO implementation) #295

Closed
opened 2026-09-28 06:44:08 +00:00 by kayg · 4 comments
Owner

Owner (2026-09-28, mail grill #257): 'we do need to come up with a very nice [way] to show threads in descending order [rather] than ascending order. please look up great designs on this… I am happy to refine this/grill this more.'

Context: calternal's Mail plugin (#257, docs/research/mail-plugin.md) is a client for many IMAP/SMTP accounts. Threads come from the provider thread ID (Gmail X-GM-THRID) or the strict Message-ID / References / In-Reply-To graph, never from subject matching. The reader follows calternal's chrome rules (docs/DESIGN.md §34: one bar, no right info sidebar, desktop overlays and phone sheets) and the calternal.js design system. The composer is the shared Composer plus the block editor, and replies carry a collapsed quote block.

Research (web search; study the real products, screenshots and docs):

  • How good clients show a conversation: Apple Mail (its 'most recent message on top' option), Gmail, Superhuman, Hey, Fastmail, Spark, Mimestream, Airmail, Outlook, Thunderbird, Front, Missive, and chat-style clients such as Delta Chat. Also newest-first timelines outside mail (GitHub PR timelines, Linear, Slack threads) where they help.
  • Newest-first problems and how the best designs solve them: reading order vs reply context; where the reply composer sits (top, bottom, inline under the newest); collapsing older messages; showing quoted text; forks and branches in the reply graph; unread markers in a long thread; jumping to the first unread; very long threads (100+ messages); messages from me; drafts inside a thread; attachments across a thread.
  • Accessibility: screen-reader order, keyboard navigation (j/k and n/p), heading structure. Reduced motion. Phone layout.
  • Performance for large threads: virtualization and lazy rendering of HTML bodies in sandboxed iframes.

Output: docs/research/mail-threads.md in ASD-STE100 Simplified Technical English. Include 3–4 concrete design proposals with annotated diagrams (ASCII or SVG), a recommendation, and a numbered grill question list in the grilling format (question, options, recommended answer). Add a source list with links. Do NOT implement anything. Commit the doc on the branch, push, and post a summary on this issue.

Owner (2026-09-28, mail grill #257): 'we do need to come up with a very nice [way] to show threads in descending order [rather] than ascending order. please look up great designs on this… I am happy to refine this/grill this more.' Context: calternal's Mail plugin (#257, docs/research/mail-plugin.md) is a client for many IMAP/SMTP accounts. Threads come from the provider thread ID (Gmail X-GM-THRID) or the strict Message-ID / References / In-Reply-To graph, never from subject matching. The reader follows calternal's chrome rules (docs/DESIGN.md §34: one bar, no right info sidebar, desktop overlays and phone sheets) and the calternal.js design system. The composer is the shared Composer plus the block editor, and replies carry a collapsed quote block. Research (web search; study the real products, screenshots and docs): - How good clients show a conversation: Apple Mail (its 'most recent message on top' option), Gmail, Superhuman, Hey, Fastmail, Spark, Mimestream, Airmail, Outlook, Thunderbird, Front, Missive, and chat-style clients such as Delta Chat. Also newest-first timelines outside mail (GitHub PR timelines, Linear, Slack threads) where they help. - Newest-first problems and how the best designs solve them: reading order vs reply context; where the reply composer sits (top, bottom, inline under the newest); collapsing older messages; showing quoted text; forks and branches in the reply graph; unread markers in a long thread; jumping to the first unread; very long threads (100+ messages); messages from me; drafts inside a thread; attachments across a thread. - Accessibility: screen-reader order, keyboard navigation (j/k and n/p), heading structure. Reduced motion. Phone layout. - Performance for large threads: virtualization and lazy rendering of HTML bodies in sandboxed iframes. Output: docs/research/mail-threads.md in ASD-STE100 Simplified Technical English. Include 3–4 concrete design proposals with annotated diagrams (ASCII or SVG), a recommendation, and a numbered grill question list in the grilling format (question, options, recommended answer). Add a source list with links. Do NOT implement anything. Commit the doc on the branch, push, and post a summary on this issue.
Author
Owner

Started research on branch job/mail-threads, based on dev at 58818bc361bf880bdf0b3e13d04d2eb7b43e8cb2. I am reviewing first-party client behavior, accessibility guidance, and large-thread rendering patterns. Research only; no implementation.

Started research on branch `job/mail-threads`, based on dev at `58818bc361bf880bdf0b3e13d04d2eb7b43e8cb2`. I am reviewing first-party client behavior, accessibility guidance, and large-thread rendering patterns. Research only; no implementation.
Author
Owner

Research finding: Apple Mail supports newest-on-top, Outlook uses newest-on-top and exposes per-message unread state, Mimestream keeps a selected message as the reply target, and Gmail gives screen reader users a direct jump to the oldest unread message. These patterns can support the owner-chosen descending order. The prior chronological-list proposal in docs/research/mail-plugin.md predates #257; the new research marks it superseded.

Research finding: Apple Mail supports newest-on-top, Outlook uses newest-on-top and exposes per-message unread state, Mimestream keeps a selected message as the reply target, and Gmail gives screen reader users a direct jump to the oldest unread message. These patterns can support the owner-chosen descending order. The prior chronological-list proposal in docs/research/mail-plugin.md predates #257; the new research marks it superseded.
Author
Owner

Finished Forgejo #295 research-only work.

Document: docs/research/mail-threads.md compares current thread patterns from Apple Mail, Gmail, Outlook, Fastmail, Mimestream, Airmail, Spark, Superhuman, HEY, Front, Missive, Thunderbird, Slack and Delta Chat. It includes four diagrammed proposals, a recommendation, accessibility and large-thread guidance, and eight numbered grill questions with options and recommended answers. It marks the earlier chronological-view proposal in mail-plugin.md as superseded by the owner’s descending-order decision in #257.

Recommendation: Keep one newest-first stream. Fold older bodies while showing message envelopes, unread state, attachment counts and known reply targets. Open a selected message from a deep link or Search in place. Use the existing shared Composer, and show a direct jump to the oldest unread message.

Head: 787e5d05350641daac926db5b34eab98200e44fe on job/mail-threads. The branch push completed; git reported Everything up-to-date.

Gates (verbatim excerpts):

cargo fmt --check — exit 0, no output.

cargo clippy --all-targets -- -D warnings — exit 0:

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 11.82s

cargo test — exit 0:

    Finished `test` profile [unoptimized + debuginfo] target(s) in 9m 23s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

The final result line is from the doc-test output; all workspace test binaries completed successfully.

bun run --cwd apps/web check — exit 0:

$ svelte-kit sync && svelte-check --tsconfig ./tsconfig.json
Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/mail-threads/apps/web
Getting Svelte diagnostics...

svelte-check found 0 errors and 0 warnings

bun run --cwd apps/web test — exit 0:

Test Files  107 passed (107)
     Tests  701 passed (701)
   Start at  09:31:47
   Duration  119.85s (transform 60%, environment 16%, import 14%, tests 7%, setup 3%)

The runner also printed Not implemented: Window's scrollTo() method and Could not parse CSS stylesheet; all tests passed.

The first Clippy attempt found that the server embeds apps/web/build, which was not built in this worktree. I built the web app as the README requires, reran Clippy successfully, then removed apps/web/build, apps/web/.svelte-kit, and the Cargo target. cargo clean reported:

     Removed 13951 files, 10.9GiB total

Owner decisions still open in the document: when a thread open sends IMAP \\Seen; whether branches need a tree view; where a saved draft appears; whether attachment search needs a thread-level list; whether sender time or provider received time sets order; and whether new mail moves the reader. The document recommends explicit read actions, parent links in a flat descending stream, a Draft row above the stream, a source-linked attachment list, provider received time, and a new-mail notice that preserves scroll and focus. These are proposals for the owner to confirm.

No product code changed.

Finished Forgejo #295 research-only work. **Document:** [docs/research/mail-threads.md](docs/research/mail-threads.md) compares current thread patterns from Apple Mail, Gmail, Outlook, Fastmail, Mimestream, Airmail, Spark, Superhuman, HEY, Front, Missive, Thunderbird, Slack and Delta Chat. It includes four diagrammed proposals, a recommendation, accessibility and large-thread guidance, and eight numbered grill questions with options and recommended answers. It marks the earlier chronological-view proposal in `mail-plugin.md` as superseded by the owner’s descending-order decision in #257. **Recommendation:** Keep one newest-first stream. Fold older bodies while showing message envelopes, unread state, attachment counts and known reply targets. Open a selected message from a deep link or Search in place. Use the existing shared Composer, and show a direct jump to the oldest unread message. **Head:** `787e5d05350641daac926db5b34eab98200e44fe` on `job/mail-threads`. The branch push completed; git reported `Everything up-to-date`. **Gates (verbatim excerpts):** `cargo fmt --check` — exit 0, no output. `cargo clippy --all-targets -- -D warnings` — exit 0: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 11.82s ``` `cargo test` — exit 0: ``` Finished `test` profile [unoptimized + debuginfo] target(s) in 9m 23s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` The final result line is from the doc-test output; all workspace test binaries completed successfully. `bun run --cwd apps/web check` — exit 0: ``` $ svelte-kit sync && svelte-check --tsconfig ./tsconfig.json Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/mail-threads/apps/web Getting Svelte diagnostics... svelte-check found 0 errors and 0 warnings ``` `bun run --cwd apps/web test` — exit 0: ``` Test Files 107 passed (107) Tests 701 passed (701) Start at 09:31:47 Duration 119.85s (transform 60%, environment 16%, import 14%, tests 7%, setup 3%) ``` The runner also printed `Not implemented: Window's scrollTo() method` and `Could not parse CSS stylesheet`; all tests passed. The first Clippy attempt found that the server embeds `apps/web/build`, which was not built in this worktree. I built the web app as the README requires, reran Clippy successfully, then removed `apps/web/build`, `apps/web/.svelte-kit`, and the Cargo target. `cargo clean` reported: ``` Removed 13951 files, 10.9GiB total ``` **Owner decisions still open in the document:** when a thread open sends IMAP `\\Seen`; whether branches need a tree view; where a saved draft appears; whether attachment search needs a thread-level list; whether sender time or provider received time sets order; and whether new mail moves the reader. The document recommends explicit read actions, parent links in a flat descending stream, a Draft row above the stream, a source-linked attachment list, provider received time, and a new-mail notice that preserves scroll and focus. These are proposals for the owner to confirm. No product code changed.
Author
Owner

Owner decisions (2026-09-28), on docs/research/mail-threads.md (merged at 6c1e5062):

  • T1: agreed. Open at the newest message, with 'Jump to oldest unread'; one newest-first stream (Proposal 1; Proposal 3 when a link or Search result selects an older message).
  • T2: B. A message is marked \Seen once it has been open on screen for about 1 s; folded messages stay unread. Settings → Mail can switch to 'on open' or 'manually'.
  • T3: branches and forks are explored later. For now: one stream plus 'Reply to [sender · time] ↗' parent links.
  • T4: agreed. A folded message shows the sender, time, one-line preview, unread state, attachment count and reply-to link; the body loads on expand.
  • T5: correct. A Draft row above the stream opens the shared Composer; drafts are not in the timeline.
  • T6: correct. Attachments on their message, plus a header 'Attachments (N)' list in the inspector popover (phone: sheet) that jumps to the source message.
  • T7: B. Order by the provider's received time; show the sender's Date; the Inbox uses the same rule.
  • T8: correct. A 'New messages ↑' notice; scroll and focus never move.
    Also: sent messages use the same card labelled 'You'; j/k through the shortcut registry; real headings per message.
Owner decisions (2026-09-28), on docs/research/mail-threads.md (merged at 6c1e5062): - T1: **agreed**. Open at the newest message, with 'Jump to oldest unread'; one newest-first stream (Proposal 1; Proposal 3 when a link or Search result selects an older message). - T2: **B**. A message is marked \\Seen once it has been open on screen for about 1 s; folded messages stay unread. Settings → Mail can switch to 'on open' or 'manually'. - T3: branches and forks are **explored later**. For now: one stream plus 'Reply to [sender · time] ↗' parent links. - T4: **agreed**. A folded message shows the sender, time, one-line preview, unread state, attachment count and reply-to link; the body loads on expand. - T5: **correct**. A Draft row above the stream opens the shared Composer; drafts are not in the timeline. - T6: **correct**. Attachments on their message, plus a header 'Attachments (N)' list in the inspector popover (phone: sheet) that jumps to the source message. - T7: **B**. Order by the provider's received time; show the sender's Date; the Inbox uses the same rule. - T8: **correct**. A 'New messages ↑' notice; scroll and focus never move. Also: sent messages use the same card labelled 'You'; j/k through the shortcut registry; real headings per message.
kayg closed this issue 2026-09-28 07:57:10 +00:00
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal#295
No description provided.