Let a member switch thread notifications off (#1025) - #1048
Merged
Conversation
Since #1010 a reply anywhere in a thread a member wrote in reaches every participant (the feed's "thread" kind). That is what makes a live discussion reach everyone, but a busy thread can get loud with no way to turn it off. This adds users.thread_notifications? (boolean, default true), the second in-app kind a member can silence after the CV-update opt-out (#980), shaped exactly like it. Honored on both sides, so the switch never leaves a badge with nothing behind it: an exists gate on the reader's flag inside thread_replies/1 suppresses the derived feed and the unread count in one place (both build on it, no extra round trip), and the live push filters recipients by the flag before broadcasting. Direct answers to your own post (the "reply" kind) are unaffected and stay on. On /notifications the day's first thread row carries a one-line hint linking to the setting, once per Berlin-day section so it stays a hint and not a banner. Additive column with a default, N-1 safe for the blue/green window. An AI agent wrote this text in my name, unreviewed by me. The work behind it is mine; I only delegated the writing. Claude-Session: https://claude.ai/code/session_014VdhLKS68PKfE4NBcW1KD7
wintermeyer
added a commit
that referenced
this pull request
Jul 24, 2026
Four features landed on main from the 2026-07-24 issue-triage batch: thread-notification opt-out (#1025/#1048), endorsers on the tag detail page (#1008/#1049), the job board's multi-tag filter (#951/#1051) and the personal content filters (#940/#1053). Minor bump for the new user-facing surface; #940 ships a new content_filters table (additive, N-1 safe) and #1025 adds an additive thread_notifications? column. An AI agent wrote this text in my name, unreviewed by me. The work behind it is mine; I only delegated the writing. Claude-Session: https://claude.ai/code/session_014VdhLKS68PKfE4NBcW1KD7
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.
Closes #1025.
Adds a per-member opt-out for the "thread" notification kind (#1010): a reply anywhere in a thread you wrote in. It is what makes a live discussion reach every participant, but a busy thread gets loud, so this gives each member one switch to turn it off.
What
users.thread_notifications?(boolean, default true) — an opt-out shaped exactly likecv_update_notifications?(Feature request: Propagate Profile Changes #980), the only other in-app kind a member can silence. Cast list + a<.toggle_form_card>on/settings/notifications.existsgate on the reader's flag insideVutuv.Activity.thread_replies/1, which boththread_items/3(feed) andcount_thread_replies/2(unread count) build on — one place, no extra round trip. Off → the events vanish from the feed and the tally.Vutuv.Posts.notify_thread_participants/2filters recipients by the flag before the live badge push, so a member who switched it off never gets a badge with nothing behind it./notificationsthe day's first thread row carries a quiet one-line hint ("You wrote in this thread. Turn this off ›") linking to the setting — once per Berlin-day section, so it stays a hint and not a banner.replykind) are unaffected and stay always-on.Migration
Additive column with a default → N-1 safe for the blue/green window.
Tests
mix precommitgreen (4646 passed).An AI agent wrote this text in my name, unreviewed by me. The work behind it is mine; I only delegated the writing.
https://claude.ai/code/session_014VdhLKS68PKfE4NBcW1KD7