···19192020### Frontend - Video Player (`src/components/feeds/VideoEmbed.tsx`)
21212222-- [ ] `VideoEmbed` component: `<video>` element with poster from `thumbnail`, native controls
2323-- [ ] Lazy-load HLS.js — attach to video element only when `playlist` URL is m3u8
2424-- [ ] Click-to-play: show thumbnail + centered play button overlay, start playback on click
2525-- [ ] Respect `aspectRatio` from embed to prevent layout shift
2626-- [ ] Render `alt` text as caption below player when present
2727-- [ ] Replace `ExternalEmbed` fallback in `EmbedContent` switch for `app.bsky.embed.video#view`
2828-- [ ] Download button in player controls area → invoke `download_video` command
2222+- [x] `VideoEmbed` component: `<video>` element with poster from `thumbnail`, native controls
2323+- [x] Lazy-load HLS.js — attach to video element only when `playlist` URL is m3u8
2424+- [x] Click-to-play: show thumbnail + centered play button overlay, start playback on click
2525+- [x] Respect `aspectRatio` from embed to prevent layout shift
2626+- [x] Render `alt` text as caption below player when present
2727+- [x] Replace `ExternalEmbed` fallback in `EmbedContent` switch for `app.bsky.embed.video#view`
2828+- [x] Download button in player controls area → invoke `download_video` command
29293030### Frontend - Image Gallery (`src/components/feeds/ImageGallery.tsx`)
31313232-- [ ] Gallery overlay: glass background (`surface_container_highest` 70% + backdrop-blur 20px)
3333-- [ ] Display `fullsize` image with `object-contain`, constrained to viewport
3434-- [ ] `Presence` fade-in/fade-out transitions
3535-- [ ] Left/right navigation arrows + position indicator for multi-image posts
3636-- [ ] Keyboard: `Escape` close, `ArrowLeft`/`ArrowRight` navigate
3737-- [ ] Caption panel: alt text (`body-md`), post text truncated to 2 lines with expand, author handle as link
3838-- [ ] Download button in gallery toolbar → invoke `download_image` command
3939-- [ ] Wire `ImageEmbed` click handler to open gallery at the clicked image index
3232+- [x] Gallery overlay: glass background (`surface_container_highest` 70% + backdrop-blur 20px)
3333+- [x] Display `fullsize` image with `object-contain`, constrained to viewport
3434+- [x] `Presence` fade-in/fade-out transitions
3535+- [x] Left/right navigation arrows + position indicator for multi-image posts
3636+- [x] Keyboard: `Escape` close, `ArrowLeft`/`ArrowRight` navigate
3737+- [x] Caption panel: alt text (`body-md`), post text truncated to 2 lines with expand, author handle as link
3838+- [x] Download button in gallery toolbar → invoke `download_image` command
3939+- [x] Wire `ImageEmbed` click handler to open gallery at the clicked image index
40404141### Frontend - Download UX
42424343-- [ ] Download button spinner/progress indicator while active
4444-- [ ] Success toast: filename + "Open in Finder" action (via `tauri-plugin-opener`)
4545-- [ ] Error toast: human-readable failure message
4646-- [ ] Right-click context menu on inline images with "Save image" option
4343+- [x] Download button spinner/progress indicator while active
4444+- [x] Success toast: filename + "Open in Finder" action (via `tauri-plugin-opener`)
4545+- [x] Error toast: human-readable failure message
4646+- [x] Right-click context menu on inline images with "Save image" option
47474848### Frontend - Settings Integration
4949