Edit history

Media channel post cards show no thumbnail for video attachments (web client omits `format`) has not been edited, so there are no earlier versions.

Current version | Original by PossiblyAHobbit
Show

Media channel post cards show no thumbnail for video attachments (web client omits `format`)

Reproduction steps

  1. Create a media channel.
  2. Create a new post with a video attachment (MP4, H.264).
  3. View the channel's post grid in the web client.

Expected behaviour

The post card shows a frame of the video as its thumbnail, like image posts do, and like the iOS app shows for the same posts.

Actual behaviour

The card shows an empty grey box with a play button. Opening the post shows the video thumbnail correctly. Image posts show their card thumbnails normally. The same posts show thumbnails in the iOS app. Tested with MP4s with and without an audio track, and with and without faststart. All are affected in the web client.

Build information

Web 2026.1010.212805, Linux (x64), Firefox 157.0, Locale en-US Self-hosted: fluxer-api image tag v1, image ID b22961f6134d (images built 2026-10-10)

Platform

Self-hosting

Evidence

fluxer-media-proxy log, test clips only (synthetic test-pattern MP4s)

fields: time | message | file | query | status | reason

2026-10-11T02:47:06Z | request rejected | A_with_audio.mp4 | width=480 | 400 | video_transform_format_required
2026-10-11T02:47:06Z | request | A_with_audio.mp4 | format=webp&width=522 | 200 | 
2026-10-11T02:47:13Z | request rejected | B_with_audio_faststart.mp4 | width=480 | 400 | video_transform_format_required
2026-10-11T02:47:13Z | request | B_with_audio_faststart.mp4 | format=webp&width=522 | 200 | 
2026-10-11T02:47:21Z | request rejected | C_no_audio.mp4 | width=480 | 400 | video_transform_format_required
2026-10-11T02:47:21Z | request | C_no_audio.mp4 | format=webp&width=522 | 200 | 
2026-10-11T02:47:23Z | request | C_no_audio.mp4 | format=webp&width=522 | 200 | 
2026-10-11T02:47:23Z | request rejected | C_no_audio.mp4 | width=480 | 400 | video_transform_format_required
2026-10-11T02:47:23Z | request rejected | B_with_audio_faststart.mp4 | width=480 | 400 | video_transform_format_required
2026-10-11T02:47:23Z | request rejected | A_with_audio.mp4 | width=480 | 400 | video_transform_format_required
2026-10-11T02:48:29Z | request | A_with_audio.mp4 | format=webp&width=522 | 200 | 
2026-10-11T02:49:07Z | request rejected | C_no_audio.mp4 | width=480 | 400 | video_transform_format_required
2026-10-11T02:49:07Z | request rejected | A_with_audio.mp4 | width=480 | 400 | video_transform_format_required
2026-10-11T02:49:07Z | request rejected | B_with_audio_faststart.mp4 | width=480 | 400 | video_transform_format_required
2026-10-11T02:53:08Z | request rejected | B_with_audio_faststart.mp4 | width=480 | 400 | video_transform_format_required
2026-10-11T02:53:08Z | request rejected | C_no_audio.mp4 | width=480 | 400 | video_transform_format_required
2026-10-11T02:53:08Z | request rejected | A_with_audio.mp4 | width=480 | 400 | video_transform_format_required
2026-10-11T02:56:21Z | request rejected | B_with_audio_faststart.mp4 | width=480 | 400 | video_transform_format_required
2026-10-11T02:56:21Z | request rejected | A_with_audio.mp4 | width=480 | 400 | video_transform_format_required
2026-10-11T02:56:21Z | request rejected | C_no_audio.mp4 | width=480 | 400 | video_transform_format_required
2026-10-11T02:58:11Z | request | A_with_audio.mp4 | format=webp&width=400&height=225 | 200 | 
2026-10-11T02:58:11Z | request | C_no_audio.mp4 | format=webp&width=400&height=225 | 200 | 
2026-10-11T02:58:11Z | request | B_with_audio_faststart.mp4 | format=webp&width=400&height=225 | 200 | 

reverse-proxy access log, same requests (client IP removed, client type from User-Agent)

fields: time | method path?query | status | client

2026-10-11T02:47:06Z | GET /media/attachments/<channel_id>/<attachment_id>/A_with_audio.mp4?width=480 | 400 | Firefox 157 (web client)
2026-10-11T02:47:06Z | GET /media/attachments/<channel_id>/<attachment_id>/A_with_audio.mp4?format=webp&width=522 | 200 | Firefox 157 (web client)
2026-10-11T02:47:13Z | GET /media/attachments/<channel_id>/<attachment_id>/B_with_audio_faststart.mp4?width=480 | 400 | Firefox 157 (web client)
2026-10-11T02:47:13Z | GET /media/attachments/<channel_id>/<attachment_id>/B_with_audio_faststart.mp4?format=webp&width=522 | 200 | Firefox 157 (web client)
2026-10-11T02:47:21Z | GET /media/attachments/<channel_id>/<attachment_id>/C_no_audio.mp4?width=480 | 400 | Firefox 157 (web client)
2026-10-11T02:47:21Z | GET /media/attachments/<channel_id>/<attachment_id>/C_no_audio.mp4?format=webp&width=522 | 200 | Firefox 157 (web client)
2026-10-11T02:47:23Z | GET /media/attachments/<channel_id>/<attachment_id>/C_no_audio.mp4?format=webp&width=522 | 200 | Firefox 157 (web client)
2026-10-11T02:47:23Z | GET /media/attachments/<channel_id>/<attachment_id>/B_with_audio_faststart.mp4?width=480 | 400 | Firefox 157 (web client)
2026-10-11T02:47:23Z | GET /media/attachments/<channel_id>/<attachment_id>/C_no_audio.mp4?width=480 | 400 | Firefox 157 (web client)
2026-10-11T02:47:23Z | GET /media/attachments/<channel_id>/<attachment_id>/A_with_audio.mp4?width=480 | 400 | Firefox 157 (web client)
2026-10-11T02:48:29Z | GET /media/attachments/<channel_id>/<attachment_id>/A_with_audio.mp4?format=webp&width=522 | 200 | Firefox 157 (web client)
2026-10-11T02:49:07Z | GET /media/attachments/<channel_id>/<attachment_id>/C_no_audio.mp4?width=480 | 400 | Firefox 157 (web client)
2026-10-11T02:49:07Z | GET /media/attachments/<channel_id>/<attachment_id>/A_with_audio.mp4?width=480 | 400 | Firefox 157 (web client)
2026-10-11T02:49:07Z | GET /media/attachments/<channel_id>/<attachment_id>/B_with_audio_faststart.mp4?width=480 | 400 | Firefox 157 (web client)
2026-10-11T02:53:08Z | GET /media/attachments/<channel_id>/<attachment_id>/B_with_audio_faststart.mp4?width=480 | 400 | Firefox 157 (web client)
2026-10-11T02:53:08Z | GET /media/attachments/<channel_id>/<attachment_id>/C_no_audio.mp4?width=480 | 400 | Firefox 157 (web client)
2026-10-11T02:53:08Z | GET /media/attachments/<channel_id>/<attachment_id>/A_with_audio.mp4?width=480 | 400 | Firefox 157 (web client)
2026-10-11T02:56:21Z | GET /media/attachments/<channel_id>/<attachment_id>/A_with_audio.mp4?width=480 | 400 | Firefox 157 (web client)
2026-10-11T02:56:21Z | GET /media/attachments/<channel_id>/<attachment_id>/B_with_audio_faststart.mp4?width=480 | 400 | Firefox 157 (web client)
2026-10-11T02:56:21Z | GET /media/attachments/<channel_id>/<attachment_id>/C_no_audio.mp4?width=480 | 400 | Firefox 157 (web client)
2026-10-11T02:58:11Z | GET /media/attachments/<channel_id>/<attachment_id>/A_with_audio.mp4?format=webp&width=400&height=225 | 200 | Fluxer iOS app
2026-10-11T02:58:11Z | GET /media/attachments/<channel_id>/<attachment_id>/C_no_audio.mp4?format=webp&width=400&height=225 | 200 | Fluxer iOS app
2026-10-11T02:58:11Z | GET /media/attachments/<channel_id>/<attachment_id>/B_with_audio_faststart.mp4?format=webp&width=400&height=225 | 200 | Fluxer iOS app