Reminders: no way to view or cancel pending reminders (Slack-style "Later" view) #19
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
There is no way for a user to see the reminders they have already set. Once you pick a time from Remind -> 30 mins / 1 hour / ..., the reminder is stored but becomes invisible - you cannot list, review, or cancel it.
Slack solves this with its "Later" view (sidebar section listing saved/reminded items with In progress / Archived / Completed tabs).
Why this matters
Users set a reminder, get no lasting confirmation, and have no way to verify it exists. Combined with the 5s-delayed confirmation (see the hairpin-NAT issue in slash-deploy), it reads as "the feature did nothing" - which is how this was originally reported.
Current state (verified 2026-08-04)
The backend works correctly end-to-end - reminders are stored in the
postreminderstable and delivered on time as a DM fromsystem-bot(observed live: a reminder due 14:59:39 was delivered at 15:00:00).What does not exist:
Server / API - only one route is registered:
POST /api/v4/users/{user_id}/posts/{post_id}/reminder(server/channels/api4/post.go:44)Webapp - only two components exist:
components/dot_menu/post_reminder_submenu.tsx(the "Remind" submenu)components/post_reminder_custom_time_picker_modal/(custom time picker)There is no list/view component of any kind.
Storage note:
GetPostReminders()returns reminders and deletes them in the same call (seeapp/post.goCheckPostReminders, and the MM-45595 comment). Any "Later" view would need to account for this - delivered reminders leave no record, so a Completed/Archived tab would need a schema change or a separate audit trail.Scope of work
This is a genuine feature build in the fork, not a config toggle:
GET /users/{user_id}/reminders(list pending) andDELETE .../reminder(cancel). Store layer already haspostreminders; needs a non-destructive read.Suggested phasing
Upstream consideration
Upstream Mattermost has no such view either, so this is net-new fork divergence - it will need carrying across upstream merges (track in
DIVERGENCE.md). Worth considering whether to propose it upstream instead.Reported by user 2026-08-04. Related: hairpin-NAT/link-preview delay issue in
slash-deploy.Design is done and merged as docs, no code yet. Keeping this open until the
feature ships.
Approach: a separate plugin (
slash-reminders-plugin), not a change to thisrepo. Zero commits here. The mobile entry point costs one call site in the
existing shared plugin-launcher helper in
slash-mobile; nothing else in eitherfork.
Scope: reminders only — not a merged Slack-style "Later" list. Saved messages
already work and stay where they are. Adds what's missing today: a list view with
time remaining, edit / reschedule / snooze / complete / archive, and standalone
reminders with their own text and no attached message.
The finding that shaped it:
GetPostRemindersis a singleDELETE ... RETURNING PostId, UserId, so core destroys the row when it fires anddiscards
TargetTimein the process. That means a read-only view overPostReminderscannot support a "completed" list at all — the row is gone at theexact moment it becomes actionable. Snooze fails from the other direction, since
rescheduling needs the row changed or core still fires at the old time.
So the plugin drains rows out of
PostRemindersinto its own table and takesownership of scheduling, rather than mirroring. The post menus in both clients stay
untouched and remain the primary way reminders get created — the plugin consumes
what they write. If the plugin is ever disabled, rows simply accumulate and core
fires them exactly as it does today.
Two side effects worth recording: reminders become more punctual (per-minute
firing vs core's 5-minute boundaries), and reminders set less than ~90 seconds out
are deliberately left to core, so they won't appear in the list.
Full PRD, task breakdown and two ADRs are in
slash-deploy/docs(private).