Skip to content

feat(pulse): rich link previews on Pulse notes (parity with channel messages) #7035

Description

@Majestic416

Motivation

Channel messages (kind 9) have had rich link previews since v0.5.6 (#3818): the sender's client fetches OpenGraph metadata, uploads the sanitized image to the relay media store, and embeds ["link-preview","snapshot",…] tags on the event; recipients render the card from those tags and never contact external sites.

Pulse notes (kind 1) have no equivalent:

  • build_note in desktop/src-tauri/src/events.rs accepts only content / reply / mentions / media tags — there is no link-preview path, unlike build_message which goes through link_preview_tags::append.
  • publishNote (desktop/src/shared/api/social.ts) exposes no preview parameters.
  • NoteCard.tsx renders <Markdown content={note.content} /> with no preview-attachment rendering.

Net effect: the same link pasted in a channel produces a rich image card, but posted to Pulse — the surface whose whole job is sharing web content — it's a bare link. This also means the Pulse composer, which reuses ForumComposer, silently throws away any preview state the sender's client resolved.

Proposed solution

Reuse the existing messages pipeline end to end:

  1. build_note gains a link_preview_tags parameter, validated by the same link_preview_tags::append (8-snapshot cap, relay-hosted /media/<sha256> image/favicon pairs) used for kind 9.
  2. publishNote accepts and forwards preview tags; the Pulse composer wires in the same useComposerLinkPreviews / linkPreviewPreparationStore machinery the channel composer already uses, including the ["link-preview","none"] suppression marker.
  3. NoteCard.tsx (desktop) renders snapshots through the existing useMessageLinkPreviews + card components.
  4. Mobile degrades gracefully to a plain link, same as the entity-link v1 stance.

Alternatives considered

  • Attach the image as a media attachment (current workaround) — clunky, loses title/description/favicon, duplicates bytes per note.
  • Relay-side unfurling — conflicts with the shipped privacy model where only the sender's client fetches external sites.
  • Recipient-side fetch on render — same conflict; the snapshot-tag design exists precisely to avoid this.

Additional context

Verified against main at desktop-v0.5.20 (local 0.5.19). Supporting references: desktop/src/shared/lib/linkPreviewSnapshot.ts, desktop/src-tauri/src/commands/link_preview.rs (OG/oEmbed fetch, size limits), desktop/src/features/pulse/hooks.ts. If #6624 lands --tag support on messages send, a matching parameter on buzz social publish would give CLI/agent-authored notes the same capability.

Searched open issues and PRs for duplicates — closest are #3369 (inline OG previews, channel-scoped) and #6624 (CLI snapshot tags for messages send). No existing issue or PR requests previews on Pulse notes: none found.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions