镜像站点 · 本页由第三方 GitHub 只读镜像提供,非 GitHub 官方站点,不接受任何登录或凭据输入。前往 github.com
Skip to content

feat(messages): show a blurred thumbnail until an image loads - #2556

Merged
kchung merged 6 commits into
block:mainfrom
kchung:chung/thumbnail-preview
Nov 5, 2026
Merged

kchung merged 6 commits into
block:mainfrom
kchung:chung/thumbnail-preview

Conversation

@kchung

@kchung kchung commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

Context

Builds on #2474. An image in a conversation shows a gray box until the full image loads. Slack shows a blurred preview of the image instead.

Description

An image from the relay now shows its small thumbnail, blurred, while the full image loads. When the full image is ready, it replaces the thumbnail. A transparent image keeps its transparency in the preview.

Changes

  • A blurred thumbnail fills the image box while the full image loads.
  • PNG, GIF, WebP and AVIF images use the relay's transparent thumbnail, so they do not show on black. Images uploaded before the relay made that thumbnail show the blur preview or the gray box as before.
  • Opening the image viewer during loading uses the full image, not the thumbnail.

Testing

Unit tests cover the thumbnail before and after the full image loads, a failed thumbnail, the transparent thumbnail for PNG and GIF images, images from other sites, and images that come back after scrolling. Native and web proxy tests accept the transparent thumbnail.

Recorded in the macOS dev app. A large photo and a transparent PNG are posted. Each shows its blurred thumbnail, then the full image.

thumbnail-demo.mp4

kchung and others added 6 commits November 5, 2026 07:41
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: Kevin Chung <chung@squareup.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: Kevin Chung <chung@squareup.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: Kevin Chung <chung@squareup.com>
The review entrance reads the first image in a preview, so placing the
thumbnail after the original keeps it there without special selectors.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Kevin Chung <chung@squareup.com>
The relay's JPEG thumbnail puts transparent pixels on black. Formats that
can be transparent now use the relay's WebP thumbnail, which both media
proxies allow; older uploads lack it and keep the blurhash.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Kevin Chung <chung@squareup.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Kevin Chung <chung@squareup.com>
@kchung
kchung force-pushed the chung/thumbnail-preview branch from cb7cf30 to 7e1ef20 Compare November 5, 2026 15:45
@kchung
kchung marked this pull request as ready for review November 5, 2026 15:58
@kchung
kchung requested a review from a team as a code owner November 5, 2026 15:58

@joahg joahg left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Thumbnail path is consistent across the Rust and browser media proxies, and the webp-only allowance is covered by accept and reject tests. Falls back cleanly to the blurhash on failure.

@kchung
kchung merged commit 199719a into block:main Nov 5, 2026
43 checks passed
cheng-block added a commit to cheng-block/buzz-app that referenced this pull request Nov 5, 2026
…ettings-shift-esc

* upstream/main: (40 commits)
  feat(conversation): let plugin rows manage messages without visiting a channel (block#2512)
  feat(github): make side-panel link opening optional (block#2629)
  feat(messages): show a blurred thumbnail until an image loads (block#2556)
  fix(relay): give large roster and read-state reads a 30s deadline (block#2627)
  fix(user-status): show a status emoji's :name: on hover where the full status shows (block#2384)
  fix(inbox): keep the list's place when returning in the same session (block#2134)
  fix(messages): pass verified labels to the forward recipient picker (block#2633)
  feat(messages): forward a message to a person (block#2167)
  docs(agents): design relay-facing paths for the whole fleet at once (block#2620)
  Route debug sessions through the credential helper (block#2541)
  perf(search): skip no-op slow-search resets on each keystroke (block#2605)
  perf(agents): dedupe channel members only for dm connection setup (block#2603)
  perf(search): keep the search tab row across palette keystrokes (block#2588)
  perf(sidebar): skip the hidden actions menu in solo and team headers (block#2582)
  perf(search): rank each palette name once per render (block#2606)
  perf(sidebar): skip re-rendering unchanged animated channel rows (block#2572)
  feat(settings): follow the system clock and let people hide message times (block#2440)
  feat(plugins): repository access rules for Git imports (block#2484)
  feat(desktop): add Settings to the macOS app menu (block#2594)
  Preserve and renew external app approval (block#2464)
  ...

Signed-off-by: Cheng Peng <cheng@block.xyz>
Co-authored-by: Cursor <cursoragent@cursor.com>
johnmatthewtennant added a commit that referenced this pull request Nov 5, 2026
…thumbnails

* origin/main: (120 commits)
  feat(conversation): let plugin rows manage messages without visiting a channel (#2512)
  feat(github): make side-panel link opening optional (#2629)
  feat(messages): show a blurred thumbnail until an image loads (#2556)
  fix(relay): give large roster and read-state reads a 30s deadline (#2627)
  fix(user-status): show a status emoji's :name: on hover where the full status shows (#2384)
  fix(inbox): keep the list's place when returning in the same session (#2134)
  fix(messages): pass verified labels to the forward recipient picker (#2633)
  feat(messages): forward a message to a person (#2167)
  docs(agents): design relay-facing paths for the whole fleet at once (#2620)
  Route debug sessions through the credential helper (#2541)
  perf(search): skip no-op slow-search resets on each keystroke (#2605)
  perf(agents): dedupe channel members only for dm connection setup (#2603)
  perf(search): keep the search tab row across palette keystrokes (#2588)
  perf(sidebar): skip the hidden actions menu in solo and team headers (#2582)
  perf(search): rank each palette name once per render (#2606)
  perf(sidebar): skip re-rendering unchanged animated channel rows (#2572)
  feat(settings): follow the system clock and let people hide message times (#2440)
  feat(plugins): repository access rules for Git imports (#2484)
  feat(desktop): add Settings to the macOS app menu (#2594)
  Preserve and renew external app approval (#2464)
  ...

Signed-off-by: John Tennant <jtennant@squareup.com>

# Conflicts:
#	src-tauri/src/relay.rs
agude-sq added a commit to agude-sq/buzz-app that referenced this pull request Nov 5, 2026
* origin/main: (28 commits)
  fix(mcp): accept create scopes in durable approvals (block#2650)
  feat(bestie): Bestie tab and Remembers you for a hosted Bestie (block#2478)
  fix(relay): p-tag a one-to-one DM's agent partner on new messages (block#2475)
  fix(agents): show each message author's username and display name (block#2628)
  fix(agents): preserve visible edits in conversation history (block#2355)
  fix(canvas): keep todo edits from approving unrelated instructions (block#2350)
  fix(messages): keep messages in their canonical channel (block#2349)
  NEXUS-4165: Add Thinking to agent creation (block#2409)
  feat(plugins): let a plugin paint a backdrop behind the shell (block#2437)
  feat(search): lead empty quick open with unread conversations (block#2634)
  NEXUS-4170: Allow external apps to create private Solo chats (block#2411)
  fix(acp): count grouped thinking levels when checking a synced level (block#2640)
  feat(conversation): let plugin rows manage messages without visiting a channel (block#2512)
  feat(github): make side-panel link opening optional (block#2629)
  feat(messages): show a blurred thumbnail until an image loads (block#2556)
  fix(relay): give large roster and read-state reads a 30s deadline (block#2627)
  fix(user-status): show a status emoji's :name: on hover where the full status shows (block#2384)
  fix(inbox): keep the list's place when returning in the same session (block#2134)
  fix(messages): pass verified labels to the forward recipient picker (block#2633)
  feat(messages): forward a message to a person (block#2167)
  ...

# Conflicts:
#	tests/browser/settings.spec.mjs
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