Muted channels surface nowhere: show them in Meelezen, add a "Verbergen" triage choice #400

Open
opened 2026-09-20 21:46:35 +00:00 by robbertbos · 0 comments
Owner

Muted channels surface nowhere today. Give them a place: Meelezen by default, with a new "Verbergen" triage choice for the muted channels you really do not want to follow.

Problem

unread_count zeroes a muted channel (mirroring App.GetChannelUnread), so a muted channel without mentions produces no row at all. Measured on a real account: six muted channels carrying 2 to 90 unread messages each, visible nowhere in Waggle.

This hits Meelezen harder than it looks. Muting a sidebar category in Mattermost mutes every channel in it, and moving a channel into a muted category mutes that channel too (server/channels/app/channel_category.go, UpdateSidebarCategories). Unmuting one channel afterwards does not unmute its category. So the one automatic route into Meelezen, seed_priority (muted category -> feed), feeds it almost exclusively muted channels, whose unread count is zero. A sidebar-seeded Meelezen row only appears when:

  • it has a mention, and splitUnreadByPage then shows it in the Postvak as well, or
  • the user unmuted that single channel inside a muted category.

In practice Meelezen is filled by manual triage rules only. Two follow-on gaps:

  • A muted channel cannot be triaged: it has no row, so its row menu never appears.
  • A triage rule stops working once the channel gets muted in Mattermost: a channel the user put in Meelezen or the Postvak disappears, although the rule says where it belongs.

Proposal

Build these two together, because one without the other does not work: showing muted channels without a way to hide them floods Meelezen with channels muted precisely to never see them, and a "Verbergen" choice needs rows to act on.

  1. Muted channels land in Meelezen. For a muted channel, count unread from the raw watermarks (total_msg_count(_root) - msg_count(_root), already fetched, no extra calls). Without a rule it seeds feed; a triage rule still wins; with a mention it shows on both pages as today. mm_unread_channel_posts has to gate on the raw count (it checks unread or mention_count now, so the row would open empty), and _threads_by_channel zeroes muted thread replies the same way. Make the reason visible on the row ("gedempt" is only in the accessible name today).
  2. A third triage choice: "Verbergen". A channel rule that keeps the channel out of both pages. Mentions still reach the Postvak, the same way a mention survives a mute in Mattermost; otherwise hiding a channel silently swallows being named. It needs a way back: hidden channels have no row, so list them somewhere (e.g. Instellingen) with "Toon weer".

Open points:

  • triage_rules.priority is an enum column with a CHECK (ck_triage_rules_priority); a third value means dropping and recreating that CHECK in a hand-written revision, since autogenerate does not see type-bound constraints. The wire contract priority: 'top' | 'feed' grows a value, and splitUnreadByPage has to drop hidden rows.
  • Whether a muted channel's seed should be feed for every mute, or only for a channel mute outside a muted category. Since a muted category mutes all its channels, the two coincide in practice; feed for every mute is simpler.

Resolved: more memberships than channels

The other half of the original report (458 memberships vs 420 channels) is answered: /users/me/channel_members includes archived channels and channels of a deleted team, /users/me/channels leaves both out and is never truncated. Getting no row is right for those. Documented in 9c1ca9d (.claude/CLAUDE.md, _UNKNOWN_CHANNEL).

Muted channels surface nowhere today. Give them a place: Meelezen by default, with a new "Verbergen" triage choice for the muted channels you really do not want to follow. ## Problem `unread_count` zeroes a muted channel (mirroring `App.GetChannelUnread`), so a muted channel without mentions produces no row at all. Measured on a real account: six muted channels carrying 2 to 90 unread messages each, visible nowhere in Waggle. This hits Meelezen harder than it looks. Muting a sidebar category in Mattermost mutes every channel in it, and moving a channel into a muted category mutes that channel too (`server/channels/app/channel_category.go`, `UpdateSidebarCategories`). Unmuting one channel afterwards does not unmute its category. So the one automatic route into Meelezen, `seed_priority` (muted category -> `feed`), feeds it almost exclusively muted channels, whose unread count is zero. A sidebar-seeded Meelezen row only appears when: - it has a mention, and `splitUnreadByPage` then shows it in the Postvak as well, or - the user unmuted that single channel inside a muted category. In practice Meelezen is filled by manual triage rules only. Two follow-on gaps: - A muted channel cannot be triaged: it has no row, so its row menu never appears. - A triage rule stops working once the channel gets muted in Mattermost: a channel the user put in Meelezen or the Postvak disappears, although the rule says where it belongs. ## Proposal Build these two together, because one without the other does not work: showing muted channels without a way to hide them floods Meelezen with channels muted precisely to never see them, and a "Verbergen" choice needs rows to act on. 1. **Muted channels land in Meelezen.** For a muted channel, count unread from the raw watermarks (`total_msg_count(_root) - msg_count(_root)`, already fetched, no extra calls). Without a rule it seeds `feed`; a triage rule still wins; with a mention it shows on both pages as today. `mm_unread_channel_posts` has to gate on the raw count (it checks `unread or mention_count` now, so the row would open empty), and `_threads_by_channel` zeroes muted thread replies the same way. Make the reason visible on the row ("gedempt" is only in the accessible name today). 2. **A third triage choice: "Verbergen".** A channel rule that keeps the channel out of both pages. Mentions still reach the Postvak, the same way a mention survives a mute in Mattermost; otherwise hiding a channel silently swallows being named. It needs a way back: hidden channels have no row, so list them somewhere (e.g. Instellingen) with "Toon weer". Open points: - `triage_rules.priority` is an enum column with a CHECK (`ck_triage_rules_priority`); a third value means dropping and recreating that CHECK in a hand-written revision, since autogenerate does not see type-bound constraints. The wire contract `priority: 'top' | 'feed'` grows a value, and `splitUnreadByPage` has to drop hidden rows. - Whether a muted channel's seed should be `feed` for every mute, or only for a channel mute outside a muted category. Since a muted category mutes all its channels, the two coincide in practice; `feed` for every mute is simpler. ## Resolved: more memberships than channels The other half of the original report (458 memberships vs 420 channels) is answered: `/users/me/channel_members` includes archived channels and channels of a deleted team, `/users/me/channels` leaves both out and is never truncated. Getting no row is right for those. Documented in `9c1ca9d` (`.claude/CLAUDE.md`, `_UNKNOWN_CHANNEL`).
robbertbos changed title from Postvak: 38 memberships without a channel row, and muted channels with unread messages surface nowhere to Muted channels surface nowhere: show them in Meelezen, add a "Verbergen" triage choice 2026-09-26 06:33:49 +00:00
Sign in to join this conversation.
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
robbertbos/waggle#400
No description provided.