diff --git a/docs/UPLOAD_PR_PLAN.md b/docs/UPLOAD_PR_PLAN.md
deleted file mode 100644
index ef8680b..0000000
--- a/docs/UPLOAD_PR_PLAN.md
+++ /dev/null
@@ -1,28 +0,0 @@
-# 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
diff --git a/frontend/src/assets/css/main.css b/frontend/src/assets/css/main.css
index 683fd9a..f0d965b 100644
--- a/frontend/src/assets/css/main.css
+++ b/frontend/src/assets/css/main.css
@@ -20,6 +20,7 @@
--color-accent: var(--accent);
--color-accent-foreground: var(--accent-foreground);
--color-destructive: var(--destructive);
+ --color-success: var(--success);
--color-border: var(--border);
--color-input: var(--input);
--color-ring: var(--ring);
@@ -40,6 +41,7 @@
--accent: oklch(0.94 0.02 260);
--accent-foreground: oklch(0.28 0.03 260);
--destructive: oklch(0.55 0.2 25);
+ --success: oklch(0.45 0.14 155);
--border: oklch(0.9 0.01 260);
--input: oklch(0.9 0.01 260);
--ring: oklch(0.42 0.08 260);
@@ -59,6 +61,7 @@
--accent: oklch(0.28 0.03 260);
--accent-foreground: oklch(0.96 0.01 260);
--destructive: oklch(0.62 0.2 25);
+ --success: oklch(0.68 0.14 155);
--border: oklch(0.32 0.02 260);
--input: oklch(0.32 0.02 260);
--ring: oklch(0.72 0.1 260);
diff --git a/frontend/src/components/upload/MetadataInspector.vue b/frontend/src/components/upload/MetadataInspector.vue
index a1ff4a9..e66f9b5 100644
--- a/frontend/src/components/upload/MetadataInspector.vue
+++ b/frontend/src/components/upload/MetadataInspector.vue
@@ -8,9 +8,16 @@
Select an image to view its metadata.
-
- {{ entry.message }}
-
+
+
{{ entry.message }}
+
+
Original
+
{{ entry.output }}
+
+
+
+
+
+
+
+ Metadata errors
+
+
+
+
+ {{ metadataErrorCount }}
+ {{ metadataErrorCount === 1 ? 'image has' : 'images have' }} metadata error. Do you want to upload
+ them with original metadata?
+