···4455### 2026-04-07
6677+- Image (single or gallery) & video player with blob downloading
78- Group notifications by reason & post, with clickable links to subjects and posts
89910### 2026-04-06
+3
docs/tasks/14-drafts.md
···10101111- [ ] Media attachments in drafts (requires local blob caching + re-upload on submit)
1212- [ ] Thread builder (compose multi-post threads as a single draft)
1313+1414+---
1515+1316- Cross-device sync via AT Protocol Permissioned Data (blocked on protocol — expected summer 2026)
+7-50
docs/tasks/15-media.md
···4455Depends on: Milestone 03 (Feeds — PostCard, EmbedContent), Milestone 06 (Settings)
6677-## Steps
77+Completed April 7, 2026. See [CHANGELOG](../CHANGELOG.md) for details.
8899-### Backend - `src-tauri/src/media.rs` + `src-tauri/src/commands/media.rs`
99+## Parking Lot
10101111-- [x] Add `DownloadDirectory` variant to `SettingsKey` enum, default to `~/Downloads` via `dirs::download_dir()`
1212-- [x] `get_download_directory()` — resolve current download path (setting or OS default), validate it exists
1313-- [x] `set_download_directory(path: String)` — validate path is a writable directory, persist to `app_settings`
1414-- [x] `download_image(url: String, filename: Option<String>)` — HTTP fetch → write to download dir, return `{ path, bytes }`
1515-- [x] `download_video(url: String, filename: Option<String>)` — fetch m3u8 manifest, resolve best variant, download TS segments, concatenate to MP4, return `{ path, bytes }`
1616-- [x] Emit `download-progress` events during video download for frontend progress UI
1717-- [x] Filename collision handling: append `_1`, `_2`, etc. if file already exists
1818-- [x] Add `dialog:default` and scoped `fs` permissions to `capabilities/default.json`
1111+- Custom video player controls (scrubber, volume, speed)? Include download?
1212+- Save to custom album/folder per account. Bigger question is if settings are scoped to
1313+ user accounts?
19142020-### Frontend - Video Player (`src/components/feeds/VideoEmbed.tsx`)
2121-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
2929-3030-### Frontend - Image Gallery (`src/components/feeds/ImageGallery.tsx`)
3131-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
4040-4141-### Frontend - Download UX
4242-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
4747-4848-### Frontend - Settings Integration
4949-5050-- [ ] Add "Downloads" section to Settings view between "Data" and "Danger Zone"
5151-- [ ] Path display + "Browse" button using Tauri `dialog.open({ directory: true })`
5252-- [ ] "Reset to default" link to restore `~/Downloads`
5353-5454-### Parking Lot
5555-5656-- [ ] Custom video player controls (scrubber, volume, speed)
5757-- [ ] Pinch-to-zoom and swipe gestures in gallery
1515+- [ ] Pinch-to-zoom and swipe gestures in gallery (or arrow navigation)
5816- [ ] Download queue with concurrent downloads
5959-- [ ] Batch download (all images in a post)
6060-- [ ] Save to custom album/folder per account
1717+- [ ] Batch download (all images in a post) as zip (`{rkey}_images.zip`)