docs: add team feedback tracker with prioritized issues

5 items: auto-select after import, upload manager, video size handling,
export as image, GIF support (product decision pending).
This commit is contained in:
Hiren Kangad
2026-03-10 18:46:40 +05:30
parent d10010c4d2
commit 3c6a5bf29e
@@ -0,0 +1,98 @@
# Team Feedback Tracker — 2026-03-10
## Priority Order
### 1. Auto-Select After Import (Small UX fix)
**Problem:** Imported items don't get selected after upload completes.
**Root cause:** `image-drop.ts:handleUploadResult()` never calls `selectionManager.selectOnly()`. `setupDragDrop()` doesn't receive a selectionManager reference.
**Fix:**
- Pass `selectionManager` to `setupDragDrop()` and `setupPaste()` in `useCanvasSetup.ts`
- After `addImageFromUpload()`/`addVideoFromUpload()` returns, call `selectionManager.selectOnly(item.id)`
- Multi-file drops: select all new items
**Files:** `frontend/src/canvas/image-drop.ts`, `frontend/src/hooks/useCanvasSetup.ts`
---
### 2. Upload Manager (Big UX win)
**Problem:** Uploads are completely silent — no progress, no status, no error feedback. Errors only logged to console.
**Design:**
- States: uploading → queued → processing → ready → failed
- Reuse the existing media job pipeline and socket events (`media:job:update`), NOT a parallel status system
- Retry/cancel support
- Upload progress via `axios.onUploadProgress` or XHR
**What exists to build on:**
- Toast system in Editor.tsx
- `media_jobs` table + `media:job:update` socket events
- Placeholder rectangles on canvas during upload
**Files:** `frontend/src/api.ts`, `frontend/src/canvas/image-drop.ts`, `frontend/src/pages/Editor.tsx`, `backend/services/media-worker.js`
---
### 3. Video Size Failure Handling (Validation + feedback)
**Problem:** Videos of certain sizes fail silently. "Certain size" is too vague — need exact failure reasons surfaced to UI.
**Fixes (in order of priority):**
1. Upload-time validation — client-side file size + resolution checks with clear error messages
2. Log exact failure reason back to UI via socket events (not just console.error on backend)
3. ffmpeg job queue/backpressure — reject or queue when at capacity
4. Explicit max supported file/resolution policy (document and enforce)
5. Preview/proxy strategy for very large videos
6. Container memory bump (2GB) is a last resort, not the primary fix
**Current limits found:**
- Container memory: 512MB (docker-compose.yml:519)
- ffmpeg/ffprobe timeout: 15s each (video-utils.js:37,94)
- File size: 200MB default (minio.js:119, configurable)
- No resolution limit, no GPU texture size check
**Files:** `backend/video-utils.js`, `backend/services/media-worker.js`, `backend/routes/upload.js`, `frontend/src/canvas/image-drop.ts`, `docker-compose.yml`
---
### 4. Export as Image (Incremental)
**Problem:** No way to download board/selection as image file.
**Design:**
- Browser download (NOT filesystem path — not realistic in-browser)
- Options: filename, format (PNG/JPEG/WebP), dimensions (locked ratio), quality, scope
- Scope: selection first, then full board
- Filename default: board name + timestamp
**What exists to build on:**
- `clipboard.ts` — full `renderer.extract.canvas()` + `generateTexture()` pipeline
- `getItemWorldBounds()` — world-space bounds for any item/group
- Resolution scaling logic (native texture ratio, capped at 4x)
- `preserveDrawingBuffer: true` already set
**Files:** `frontend/src/canvas/clipboard.ts`, `frontend/src/components/Toolbar.tsx`, `frontend/src/pages/Editor.tsx`
---
### 5. GIF Support (Product decision needed first)
**Problem:** GIFs upload fine but render as static first frame only.
**Product decision required — three options:**
1. **Stay animated** — use PixiJS GifSprite, but risk CPU/GPU explosion with many visible GIFs
2. **Autoplay only in viewport** — animate when visible, pause when culled (like video lifecycle)
3. **Static poster by default, animate-on-click** — safest, consistent with video behavior
**Recommendation:** Normalize GIFs to video-like lifecycle, not image lifecycle. Treat as lightweight video with similar culling, poster, and play/pause behavior.
**Technical context:**
- PixiJS v8.17 has built-in `GifSprite` (available but unused)
- GIFs currently classified as `type: 'image'`, use `ImageSprite`
- No animation metadata stored (frame count, duration)
- GIFs excluded from LOD tiers (stored as-is like SVG)
**Files:** `frontend/src/canvas/SceneManager.ts`, `frontend/src/canvas/sprites/ImageSprite.ts`, `backend/routes/upload.js`