Repository navigation
feat(timeline): mute a source, a person or a kind, for good or until a time, for yourself alone - #635
Merged
Merged
Conversation
…a time, for yourself alone An opened item's Mute button and a Muted row with unmute on the Timeline page; POST /api/v1/activities/mute and GET /activities/mutes; MCP mute_activities and activity_mutes; the assistant's mute_activities, which asks first after outside text. A muted actor's or kind's activities count as hidden for the person: left out of the page, shown by hidden=true, never deleted, still seen by everyone else. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ln25ykE6uBDqx21WBU94SX
This was referenced Oct 18, 2026
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.
Requested by Adeel · project thread
Description
Before: the only way to get a noisy source off your timeline was to hide its items one at a time, and the next one came back.
After: an opened item has Mute Work Gmail: everything from that source or person leaves your timeline, with Undo in the message, and a Muted row above the list shows what you muted with an × to lift each one. Muting hides, it never deletes: the activities stay stored, still trigger automations and still show to everyone else, and
hidden=trueon the timeline shows them to you, as what you hid. Agents mute a source or person (actor) or a kind of activity (kind, the kinds under it too), for good oruntila time (snooze it for a day), withPOST /api/v1/activities/muteandGET /api/v1/activities/mutes, the MCPmute_activitiesandactivity_mutestools (andhiddenontimelineto read what was hid or muted), and the assistant'smute_activities, which acts at once but asks first after it has read text from outside Lens, as hiding does.How:
domain/event_mutes.pykeeps oneevent_muterow per person and target (an actor id or a kind) with the name shown,untiland when it was set; a mute that has run out is dropped the next time the person's mutes are read, and a person's rows go when they are removed.event_mutes.keeperreplacesevent_marks.keeperin the timeline route and the assistant: a muted actor's or kind's activities count as hidden for that person, so the page (hidden=false) leaves them out,hidden=trueshows them, and a For you page scores only what is left. The page'suseMuteshook reloads the timeline after a mute and filters the items already loaded at once.Motivation and Context
Step 7 of the activity stream design (thread above): "Mute. Each person mutes a source or a kind ('hide syslog') or snoozes it for a day. Muting hides; it never deletes." Follows #570, #622, #627 and #631.
Types of changes
!in the title)Checklist:
make hookschecks it on commit).docs/accordingly.changelog.d/(timeline-mutes.md).Done questions (AGENTS.md)
POST /api/v1/activities/mute,GET /api/v1/activities/mutes, MCPmute_activitiesandactivity_mutes, the assistant'smute_activities.DEFINE TABLE IF NOT EXISTS; nothing existing changes shape, so no migration step.test_timeline_mutes.py(actor and kind, hidden filters, snooze and expiry, bad asks, removal, MCP, read-only token, assistant at once and asking first), jesttimeline-ui.test.tsx(Mute, the Muted chip, Undo); docs timeline.md (Muting section), mcp.md, assistant.md, automations.md, requirements.md, changelog.d;make openapiregenerated the client.Local CI (
ci/local-ci.sh) on this head: running; CI on the PR decides the merge.Generated by Claude Code