feat(messages): add pinned channel messages - #1990
Merged
Merged
Conversation
hmans
force-pushed
the
hmans/pinned-message-ideas
branch
from
August 11, 2026 16:01
1870245 to
e94ad90
Compare
…ideas * origin/main: feat(auth): add server invite links (#1983) # Conflicts: # cli/internal/pb/chatto/core/v1/event.pb.go # docs/fdr/INDEX.md
hmans
added a commit
that referenced
this pull request
Aug 11, 2026
…-0-details * origin/main: feat(messages): add pinned channel messages (#1990) # Conflicts: # apps/docs-website/src/content/docs/releases/0-5-0.mdx # cli/internal/pb/chatto/core/v1/event.pb.go # cli/internal/pb/chatto/core/v1/projection_snapshots.pb.go # cli/internal/pb/chatto/realtime/v1/realtime.pb.go
hmans
added a commit
that referenced
this pull request
Aug 11, 2026
* origin/main: feat(messages): add pinned channel messages (#1990) docs(events): document integration and logging contracts (#2004) fix(events): guard single-run lifecycles (#2003) fix(events): add bounded subject reads (#2002) fix(events): validate snapshot bindings (#2001) fix(events): require pointer projections (#2000) fix(events): make nil loggers safe (#1999) ci: run pull request workflows for stack bases (#1998) feat(auth): add server invite links (#1983) fix(i18n): restore regional locale fallback chains (#1987) feat(rooms): allow flexible Unicode names (#1986) feat(rooms): add slow mode (#1980) chore(agent): add session wrap-up skill (#1981) fix(workers): harden durable recovery (#1978) feat(admin): report durable worker health (#1979) perf(core): defer server member detail hydration (#1977) refactor(core): use durable consumers for cleanup (#1974) fix(core): make user key shredding crash-safe (#1973) test(e2e): add large-server performance CI (#1976) feat(events): add durable pull-worker execution (#1972) # Conflicts: # apps/frontend/messages/de-AT/rbac.json # apps/frontend/messages/de-CH/rbac.json # apps/frontend/src/lib/components/chat/adminNav.test.ts # apps/frontend/src/lib/components/chat/adminNav.ts # apps/frontend/src/routes/chat/[serverId]/manage/+layout.svelte # cli/internal/core/user_auth_projection.go # cli/internal/core/user_projection.go # cli/internal/core/user_projection_snapshot_test.go # cli/internal/core/users.go # cli/internal/evtstream/subjects.go # cli/internal/pb/chatto/core/v1/event.pb.go # cli/internal/pb/chatto/core/v1/models.pb.go # cli/internal/pb/chatto/core/v1/projection_snapshots.pb.go # cli/internal/pb/chatto/core/v1/user_events.pb.go # docs/adr/INDEX.md # docs/architecture/interfaces.md # docs/fdr/INDEX.md # proto/chatto/core/v1/event.proto
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.
Why
Channel members need a durable place for announcements, decisions, and other useful messages without copying their content elsewhere. Room managers should be able to curate that list with the existing room-management authority, while message edits, retractions, room access, and mixed client/server versions remain safe.
Closes #1982.
What changed
room.manage; archived rooms reject changes.Messageresource, so timeline, singular message, andBatchGetMessagesresponses share one authoritative shape.server_state_upsertrealtime operation. The retained client store refreshes canonical resources, applies message edits immediately, removes retractions, and scrubs content on access loss or room eviction.Compatibility and security
server_state_upsertand ignore its unknown nested pin field. Newer clients gate pinned messages at server version0.5.0-0, so they do not call the new RPCs on older servers.room.manage, and managers of archived rooms cannot mutate pins. Client plaintext mirrors are reset on authorization loss, room removal, projection reset, and realtime-retention eviction.Test plan
mise codegen-protomise test-climise test-frontendmise lintmise license-checkgit diff --checkBatchGetMessagesreturns authoritativepinnedstate; a freshly hydrated row showed Unpin; unpinning immediately changed the action to Pin; re-pinning restored the fixture; and the network contained normal message hydration plus list/create/delete pin calls with no pin-specific batch endpoint. A stable reload reported no console warnings or errors in DevTools.