Skip to content

feat(desktop): star channels (Slack-style favorites)#860

Merged
wesbillman merged 2 commits into
mainfrom
brain/star-channels
Jun 4, 2026
Merged

feat(desktop): star channels (Slack-style favorites)#860
wesbillman merged 2 commits into
mainfrom
brain/star-channels

Conversation

@wesbillman
Copy link
Copy Markdown
Collaborator

@wesbillman wesbillman commented Jun 4, 2026

Star channels (Slack-style favorites)

Adds the ability to star/favorite channels, surfaced as a special Starred section pinned at the top of the sidebar — modeled exactly on the channel-muting feature (#838).

Behavior

  • Right-click any channel → Star channel / Unstar channel (top of the context menu, separate from the "Move to section" submenu).
  • A starred channel moves into the Starred section and no longer appears in its normal group — Slack-style exclusivity, so each channel renders exactly once.
  • Star state syncs across devices via NIP-78 (kind 30078, d-tag channel-stars, nip44-encrypted to self, last-writer-wins merge).

Screenshots

Context menu — Star channel

Star channel context menu

Starred section (engineering lives only under Starred — gone from Channels)

Starred section

Context menu — Unstar channel (when already starred)

Unstar channel context menu

Approach

Mirrors the channel-muting pattern rather than folding into the channel-sections store: a dedicated channelStarsStorage / channelStarsSync / useChannelStars trio with its own d-tag. This is the cleaner, fresher pattern (per-channel flag with updatedAt + last-writer-wins merge) and keeps the two concerns isolated.

  • New KIND_CHANNEL_STARS constant (same kind 30078, distinct d-tag).
  • Context-menu toggle in ChannelContextMenuItems, plumbed through ChannelGroupSection / CustomChannelSection.
  • Starred channels are excluded from the custom-section and default-Channels buckets so they render only under Starred.
  • ChannelGroupSection browse/create buttons made optional (a virtual Starred group has neither) — backward-compatible.

Scope

  • Stream channels for v1 (the Starred section lives in the channels area). Forums/DMs starring deferred — adding the toggle there without a matching Starred bucket would be inconsistent.
  • Desktop first; mobile to follow.

Tests

  • Unit: 539/539 pass (incl. 20 new store tests — parse/merge/toggle round-trips).
  • tsc --noEmit: clean.
  • biome: clean (2 inherited non-null-assertion warnings, identical to the mute e2e).
  • e2e: 4/4 pass — including an explicit exclusivity test (starred channel present in Starred, absent from Channels).

Add the ability to star/favorite channels, surfaced as a special
"Starred" section pinned at the top of the sidebar. Mirrors the
channel-muting feature: a per-channel flag with its own NIP-78 store,
sync manager, and hook, toggled from the channel context menu.

- Star/Unstar is a top-level context-menu item, separate from the
  "Move to section" submenu.
- A starred channel also remains in its normal group (Slack-style
  overlay, not a move).
- State syncs across devices via NIP-78 (kind 30078, d-tag
  "channel-stars", nip44-encrypted to self, last-writer-wins merge).
- Scope: stream channels (forums/DMs deferred).

Co-authored-by: Brain <21994759fc7a6fa6b965551d35cfd7897d262f2495467f2d78694ddcfa6a5c7e@sprout-oss.stage.blox.sqprod.co>
Signed-off-by: Wes <wesbillman@users.noreply.github.com>
@wesbillman wesbillman requested a review from a team as a code owner June 4, 2026 22:03
A starred channel was rendered in both the Starred section and its
normal group. Match Slack: exclude starred channels from the custom
sections and default Channels buckets so each renders exactly once —
under Starred when starred, otherwise its normal home.

Co-authored-by: Brain <21994759fc7a6fa6b965551d35cfd7897d262f2495467f2d78694ddcfa6a5c7e@sprout-oss.stage.blox.sqprod.co>
Signed-off-by: Wes <wesbillman@users.noreply.github.com>
@wesbillman wesbillman merged commit c10b4f8 into main Jun 4, 2026
15 checks passed
@wesbillman wesbillman deleted the brain/star-channels branch June 4, 2026 22:32
michaelneale added a commit that referenced this pull request Jun 5, 2026
* origin/main:
  chore(release): release version 0.3.11 (#865)
  fix(mobile+desktop): cross-device read state sync + diagnostic logging (#843)
  feat(mobile): star channels (Slack-style favorites) (#863)
  feat: desktop-screenshot skill to stop agents uploading relay media to PRs (#862)
  feat(desktop): star channels (Slack-style favorites) (#860)
  fix(desktop): handle symlinked persona pack directories (#859)
  feat: channel muting for desktop and mobile (#838)
  feat(acp): default SPROUT_ACP_MEMORY to on (#854)
  fix(desktop): eliminate image-hover layout jump in messages (#813)
  chore(release): release version 0.3.10 (#849)
  fix(desktop): harden relay mesh connect p-tag (#834)
  fix(desktop): scroll activity panel to bottom on open (#848)
  Polish desktop profile menu interactions (#836)
  fix(desktop): outline thread hover targets (#845)
  fix(desktop): keep message actions hover-only (#844)
  fix(desktop): let inbox composer fill available width (#841)

# Conflicts:
#	desktop/src/app/AppShell.tsx
#	desktop/src/features/workspaces/useWorkspaceInit.ts
tlongwell-block pushed a commit that referenced this pull request Jun 5, 2026
* origin/main: (39 commits)
  docs: add VISION_MESH.md — the compute-commons vision (#867)
  fix(desktop): simplify profile popover header (#853)
  fix(desktop): remove thread comment hover outline (#861)
  feat(desktop): always show channel section search/add buttons (#856)
  chore(release): release version 0.3.11 (#865)
  fix(mobile+desktop): cross-device read state sync + diagnostic logging (#843)
  feat(mobile): star channels (Slack-style favorites) (#863)
  feat: desktop-screenshot skill to stop agents uploading relay media to PRs (#862)
  feat(desktop): star channels (Slack-style favorites) (#860)
  fix(desktop): handle symlinked persona pack directories (#859)
  feat: channel muting for desktop and mobile (#838)
  feat(acp): default SPROUT_ACP_MEMORY to on (#854)
  fix(desktop): eliminate image-hover layout jump in messages (#813)
  chore(release): release version 0.3.10 (#849)
  fix(desktop): harden relay mesh connect p-tag (#834)
  fix(desktop): scroll activity panel to bottom on open (#848)
  Polish desktop profile menu interactions (#836)
  fix(desktop): outline thread hover targets (#845)
  fix(desktop): keep message actions hover-only (#844)
  fix(desktop): let inbox composer fill available width (#841)
  ...
tlongwell-block pushed a commit that referenced this pull request Jun 5, 2026
* origin/main: (39 commits)
  docs: add VISION_MESH.md — the compute-commons vision (#867)
  fix(desktop): simplify profile popover header (#853)
  fix(desktop): remove thread comment hover outline (#861)
  feat(desktop): always show channel section search/add buttons (#856)
  chore(release): release version 0.3.11 (#865)
  fix(mobile+desktop): cross-device read state sync + diagnostic logging (#843)
  feat(mobile): star channels (Slack-style favorites) (#863)
  feat: desktop-screenshot skill to stop agents uploading relay media to PRs (#862)
  feat(desktop): star channels (Slack-style favorites) (#860)
  fix(desktop): handle symlinked persona pack directories (#859)
  feat: channel muting for desktop and mobile (#838)
  feat(acp): default SPROUT_ACP_MEMORY to on (#854)
  fix(desktop): eliminate image-hover layout jump in messages (#813)
  chore(release): release version 0.3.10 (#849)
  fix(desktop): harden relay mesh connect p-tag (#834)
  fix(desktop): scroll activity panel to bottom on open (#848)
  Polish desktop profile menu interactions (#836)
  fix(desktop): outline thread hover targets (#845)
  fix(desktop): keep message actions hover-only (#844)
  fix(desktop): let inbox composer fill available width (#841)
  ...

Signed-off-by: npub1mprnacetjua2xx3p5eddmhxyk6wv929ymm5py8kd2xfxurxahspqqlgyta <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants