# Upload flow PR plan ## Phase 1 — Configure UI (done) - [x] Split upload page: dropzone, queue, metadata inspector, configure modal - [x] Batch settings form (ZK / hotlink, expiry, max views, ZK password) - [x] Preset → API helpers (`resolveUploadBatchExpiresAt`, `resolveUploadBatchMaxViews`, ZK prepare options builder) - [x] Modal validation on Upload; batch settings summary after confirm ## Phase 2 — Upload execution + dual queue status (in progress) - [ ] **Separate upload state** from metadata (`UploadQueueEntry` per file key); metadata column unchanged in `UploadQueueList` - [ ] Show upload column once a batch upload has started (pending / uploading / uploaded / failed / skipped) - [ ] `onBatchUpload`: stripped blob → encrypt → `useUploadStore` POST (ZK + hotlink) - [ ] Share URLs via `buildZkViewerPath` / `buildHotlinkImagePath` (+ optional absolute URL from `VITE_CLEARNET_DOMAIN`) - [ ] Disable dropzone / configure while batch upload runs; clear upload state on new pick ## Phase 3 — Hardening (follow-up or tail of PR) - [ ] ALTCHA: fetch challenge + solve, pass `x-altcha` on upload (frontend not wired yet; backend may allow when disabled) - [ ] Copy-to-clipboard for share links; optional delete token display - [ ] Modal Esc / backdrop close - [ ] Single validation gate (modal vs builder) ## Out of scope - Viewer / delete pages - E2E tests against docker-compose