RocketChat / RocketChat/Rocket.Chat
Enhancement: Time-Based Pinning for Messages (with Optional Auto-Unpin)
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 46.1k
- Forks
- 13.9k
- Avg merge
- 3d 3h
- Merged PRs (30d)
- 130
Description
Summary
While Rocket.Chat already supports message pinning, I would like to propose an enhancement:
introducing time-based pinning with optional auto-expiry.
This would allow users to pin a message not just permanently, but for a defined duration
(e.g., 4 hours, 7 days, 30 days, or custom).
Problem / Motivation
In regular conversations (especially 1:1 chats), users often pin messages as reminders —
meeting links, tasks, temporary announcements, or follow-ups.
However:
- Pinned messages stay indefinitely unless manually unpinned.
- Over time, the pinned section can become cluttered.
- Many pinned messages are temporary by nature.
A time-based pin option would help keep conversations clean and more intentional.
Proposed Solution
When pinning a message, provide an optional duration selector:
- 4 hours
- 24 hours
- 7 days
- 30 days
- Custom duration
- Forever (default behavior)
Once the duration expires:
- The message is automatically unpinned.
- Optionally, a small notification could inform the user.
Possible UI Approach
When a user clicks "Pin Message":
Add an additional modal or dropdown:
Pin Duration:
- ⏳ Temporary
- 📌 Permanent
If Temporary is selected:
- Show duration options.
This keeps the existing UX intact while adding flexibility.
Technical Considerations
- Store
pinnedAtandpinExpiresAttimestamps. - A scheduled job or background task could check for expired pins.
- Default behavior remains unchanged if no duration is selected.
- Should work consistently across:
- Channels
- Private groups
- Direct messages
Why This Matters
- Keeps conversations organized.
- Reduces manual cleanup.
- Improves usability for reminder-style workflows.
- Makes pinned messages more dynamic and purposeful.
Scope Clarification
Before proceeding, I would appreciate feedback on:
- Whether this aligns with the product direction.
- If expiration logic should be handled server-side only.
- Whether this should be optional at workspace level (admin setting).
I would be happy to work on the implementation if this direction is considered valuable.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
The issue does not name specific files, tests, or entry points. Start by tracing the existing message-pinning flow across channels, private groups, and direct messages, then resolve the open product and server-side expiration questions before defining implementation scope and completion criteria.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- full-stack
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 25/100