2026-04-23 — Asset Finder bulk operations, one-click upload, and matching fixes
- Bulk selection on the Asset Finder page. Each reference gets a checkbox; the toolbar has Select All, Select Unresolved, and Select Needs Description. A sticky top action bar appears when anything is selected, with Use Placeholder, AI Description, Delete Image, and Clear.
- Bulk AI Description runs the AI flow over every selected reference serially, with a live progress modal showing per-image status (spinner → done / error / skipped). Placeholders, non-images, and references without a linked file are skipped automatically.
- Bulk Use Placeholder and Bulk Delete Image create or soft-delete assets across many references at once. Use Placeholder refuses to overwrite real uploads and explains how many were skipped; Delete Image moves linked files to trash, unlinks every reference that pointed at them, and re-runs auto-match.
- One-click upload on the Asset Finder. The old two-step Select Files → Upload widget is now a single dropzone card: click or drop a folder, it uploads immediately with a progress overlay.
- Fixed folder-upload matching. Browsers send folder-picker filenames with their relative path (e.g.
figures/chart.png); the server was turning that intofigures_chart.pngand breaking auto-match. Uploads now always store just the basename. - PDF and EPS references now match PNG uploads with the same stem, since we convert those formats to PNG at upload. Covers the common case where a TeX file uses
\includegraphics{figures/foo.pdf}but the stored asset is the renderedfoo.png. - Bigger upload form on the project page, with icons + larger titles for each file type, a single "Upload" button right-aligned at the bottom, and a collapsible card that stays closed by default so it doesn't push the file list down.
- Dev Login on the landing page (dev environment only) — enter any
.eduemail to log in locally without configuring OAuth. - "Generate with AI" renamed to "AI Description" to make it clear the feature writes descriptions of the image, not generates an image.