Repository navigation
feat: mark a message as unread from its menu - #1933
Merged
Merged
Conversation
|
@ald3b is attempting to deploy a commit to the Inbox Zero Team on Vercel. A member of the Team first needs to authorize it. |
Contributor
[Medium impact] The change reaches unread behavior across web, mobile, and the thread API. The delayed-read finding remains partly unresolved, so the PR should not merge yet. Findings
SummaryAdds “Mark as unread” to stored messages on mobile, web, and desktop.
|
Contributor
Playwright screenshotsFeature frames for this PR:
Open screenshot gallery · Dashboard · CI run Updated for commit |
ald3b
force-pushed
the
feat/unread-mark-message
branch
from
October 23, 2026 07:43
16a838b to
e2848dd
Compare
ald3b
force-pushed
the
feat/unread-mark-message
branch
from
October 23, 2026 07:58
e2848dd to
77e700e
Compare
Marking a whole chat unread brings its dot back but not the place to resume. A message's menu now has "Mark as unread", right after Reply: the chat's dot returns, it stays unread for the rest of the visit, and the next open puts the New divider above the first reply from that message on. The user's own messages offer it too; live progress and subagent rows don't. threads/markUnread takes an optional messageId and moves the read cursor to just before that message. Mobile offers it in the native context menu, the Android sheet and the VoiceOver actions; web in the message's More menu, which now sizes to its content. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
ald3b
force-pushed
the
feat/unread-mark-message
branch
from
October 23, 2026 08:12
77e700e to
ddba5cb
Compare
tyleruenaka
added a commit
to tyleruenaka/rakazo
that referenced
this pull request
Oct 24, 2026
Ported from upstream f6a1ef2 (elie222#1933). Any sent message, your own included, can be marked unread: on the web from the hover More menu, on the phone from the long-press menu. The chat turns unread in the sidebar and the next open shows New above the first reply from that message. The server takes an optional message id on threads.markUnread and moves the chat's read position to just before it. A group marked unread by hand stays unread until it is opened again, like a bot chat already did. Fitted to the fork: the item sits in Tyler's More menu above Copy with the same icon size, and in his phone message sheet right under Reply. Live progress and subagent rows don't offer it.
tyleruenaka
added a commit
to tyleruenaka/rakazo
that referenced
this pull request
Oct 24, 2026
) * feat: show a New divider above the replies you haven't seen Ported from upstream b5325c4 (elie222#1789). Opening a chat that had unread replies puts a New line above the first reply you hadn't seen, on web and on the phone. Replies you watch arrive live never get one. The server keeps a read position per chat (new lastReadSeq column; existing chats start as read up to their latest message, so no divider shows for old history). threads.markRead now answers with where the user had read up to. Fitted to the fork: the web transcript lives in Shell.tsx here, so the divider is wired there; the divider uses the time separator's size and weight instead of upstream's small caps; on the phone it breaks a run of joined bubbles the way a time separator does. Tyler's click-to-dictate voice test is kept as is. * feat: mark a message as unread from its menu Ported from upstream f6a1ef2 (elie222#1933). Any sent message, your own included, can be marked unread: on the web from the hover More menu, on the phone from the long-press menu. The chat turns unread in the sidebar and the next open shows New above the first reply from that message. The server takes an optional message id on threads.markUnread and moves the chat's read position to just before it. A group marked unread by hand stays unread until it is opened again, like a bot chat already did. Fitted to the fork: the item sits in Tyler's More menu above Copy with the same icon size, and in his phone message sheet right under Reply. Live progress and subagent rows don't offer it. * fix: show the New divider above grouped bot-to-bot rows too The fork folds back-to-back bot-to-bot markers into one row, which upstream doesn't have. When the first unread message sat inside that row, no divider was drawn at all. Draw it above the row on web and phone, like a voice call. * test: cover the New divider inside a grouped bot-to-bot row; make the read cursor migration safe to re-run - A browser test opens a chat whose first unread message is the second one in a grouped bot-to-bot row and checks New sits above the row. It fails without the previous commit's fix. A core test checks the same thing for the shared logic that web and phone both use. - The migration now adds the column only if it's missing and only fills in chats still at the default, so running it again never overwrites a read position.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
"Mark as Unread" on a chat brings its dot back, but not the place to pick up from. When you read a long answer and want to come back to it later, the next open lands at the latest message with no "New" line, so you have to find that reply again yourself.
What changed
Every sent message's menu now has Mark as unread, right after Reply:
Server.
threads/markUnreadtakes an optionalmessageId. With it, the thread is marked unread and the read cursor moves to just before that message.messageId, the call behaves exactly as before.Shared. One helper in
@rakazo/coredecides which messages offer the action, so mobile and web agree.Mobile.
message.badgesymbol (an outline speech bubble with a dot, matching the menu's other outline icons).Web and desktop.
New copy. "Mark as unread", the menu item's label and accessible name.
How it was tested
On an iOS 27 Simulator with a Debug build against a local server, and in Chromium against the same kind of server. The test account had a bot chat with two answered questions, all read. Light and dark mode were both checked.
Unit tests. Each new test fails without this change.
markReadreports that message as the start. A message that isn't in the thread is refused and changes nothing.Full suites.
localStoragefail. They fail the same way without this change, and they pass with that storage turned off.Web e2e: "marking a message unread brings the chat back with New above the reply from there" (new).
message-mark-unread-menuandmessage-mark-unread-dividerfor CI.Mobile. CI can't capture the native context menu; the iOS results above come from a simulator.
Not in this PR
That is a separate change.
🤖 Generated with Claude Code