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:
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.
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.
NoteCard.tsx (desktop) renders snapshots through the existing useMessageLinkPreviews + card components.
- 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.
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_noteindesktop/src-tauri/src/events.rsaccepts only content / reply / mentions / media tags — there is no link-preview path, unlikebuild_messagewhich goes throughlink_preview_tags::append.publishNote(desktop/src/shared/api/social.ts) exposes no preview parameters.NoteCard.tsxrenders<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:
build_notegains alink_preview_tagsparameter, validated by the samelink_preview_tags::append(8-snapshot cap, relay-hosted/media/<sha256>image/favicon pairs) used for kind 9.publishNoteaccepts and forwards preview tags; the Pulse composer wires in the sameuseComposerLinkPreviews/linkPreviewPreparationStoremachinery the channel composer already uses, including the["link-preview","none"]suppression marker.NoteCard.tsx(desktop) renders snapshots through the existinguseMessageLinkPreviews+ card components.Alternatives considered
Additional context
Verified against
mainat 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--tagsupport onmessages send, a matching parameter onbuzz social publishwould 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.