Skip to content

[FEATURE] Cross-room Starred Messages view in the navigation #42689

Description

@deepak0x

Context

Rocket.Chat lets users star individual messages, and each room's contextual bar has a "Starred Messages" panel that surfaces those messages — but only for that one room. There is no way to see all starred messages across rooms in a single view.

Users frequently star messages as lightweight bookmarks or follow-up reminders. When those messages live in different rooms, there is no way to review them without opening each room and its contextual bar individually. This friction discourages use of starring as a personal productivity tool.

Most comparable messaging platforms (Slack Saved Items, Teams Saved Messages, Mattermost Saved Posts) provide exactly such a cross-room collection.

Feature description

Add a Starred Messages entry to the main navigation sidebar — consistent with the placement of existing cross-room views like Discussions or Favorites.

Opening this view shows a scrollable list of every message the current user has starred, across all rooms they have access to. Each entry displays:

  • The message text (truncated if long)
  • The room name where it lives
  • The original sender and timestamp
  • A direct link / click-to-jump that opens the room at that message in context

The list is ordered by most-recently-starred first and includes a lightweight text filter to narrow results by message content or room name. Unstarring a message from this view removes it from the list immediately, consistent with the existing room-level behavior.

No existing behavior changes; the room-level Starred Messages panel continues to work as it does today.

Value

  • Transforms starring into a practical cross-room bookmark or personal to-do system
  • Eliminates the need to remember which room a starred message lives in
  • Gives power users a single review surface without adding complexity to the per-room experience
  • Aligns Rocket.Chat with the pattern users expect from comparable platforms

Activity

  1. deepak0x commented on Oct 10, 2026

    @deepak0x
    Author

    cc @rodrigok — happy to implement this if it fits the roadmap.

  2. rodrigok commented on Oct 10, 2026

    @rodrigok
    Member

    @deepak0x it's a nice idea. Can you define the design and backend changes needed for this? Remember that the control of the user access to the messages of a room is made via the subscription.

  3. deepak0x commented on Oct 10, 2026

    @deepak0x
    Author

    Thanks for taking a look. Here's how I'd approach it.

    Backend

    The current chat.getStarredMessages endpoint requires a roomId, and its handler (findStarredMessages in apps/meteor/server/api/lib/messages.ts) checks access through canAccessRoomAsync for that one room. For the cross-room view I'd add a new endpoint rather than making roomId optional, so the existing contract stays untouched:

    GET /v1/chat.getAllStarredMessages with count, offset, and an optional text filter.

    Access control via subscriptions, as you said: resolve the user's room ids first with Subscriptions.findByUserId(userId) projected to rid, then query messages against that set. New model method next to the existing findStarredByUserAtRoom:

    findStarredByUser(userId, rids, options) {
    	return this.findPaginated(
    		{ 'starred._id': userId, rid: { $in: rids }, _hidden: { $ne: true } },
    		options,
    	);
    }

    A message only shows while the user holds a subscription to its room, so leaving a room or losing access drops those messages from the view automatically. Messages already has a sparse index on starred._id, so the query stays cheap, and starred counts per user are small in practice.

    One wrinkle on sort order: starred is stored as { _id: userId }[] with no timestamp, so "most recently starred first" isn't possible today. I'd sort by message ts descending for the first version. If star-time ordering matters, the follow-up would be storing { _id, ts } on star in updateUserStarById and sorting on that for new stars, with old entries falling back to message ts. I'd keep that out of scope initially.

    Unstarring from the view reuses the existing star action and invalidates the list query.

    Frontend

    • New route /starred-messages registered in apps/meteor/client/startup/routes.tsx, page wrapped in MainLayout, same as /directory.
    • Nav entry in NavBarPagesGroup following the NavBarItemDirectoryPage pattern, with the star icon.
    • The page itself is close to the existing StarredMessagesTab contextual bar: same paginated query loop against the new endpoint, same message rendering. Each row adds the room name and links to the message through the existing jump-to-message path.
    • The text filter runs client side over loaded pages at first; a server-side text param can come later if lists get long.
    • The room-level panel stays as is.

    If this sounds right I'll start on a PR: backend endpoint plus model method with tests first, then the view.

  4. DRafi2006 commented on Oct 10, 2026

    @DRafi2006

    i would like to work on it. please assign it to me

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    type: featurePull requests that introduces new feature

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions