Settings: highlight the selected adapter, restyle radios/password/select
for the dark theme, and keep saved settings scoped to the chosen adapter.
CI: run npm test + gitleaks on push/PR so the suite is an actual gate.
- Immich adapter (adapters/immich.js): swipe a self-hosted photo library
over its REST API, proving the adapter contract works for remote
sources, not just the filesystem.
- Refactor the preview contract from resolvePreviewPath() to
streamPreview()/streamThumbnail(), so adapters can serve previews from
anywhere (local file, proxied fetch, etc).
- macOS Quick Look-backed thumbnail cache (lib/thumbnails.js): real
resized thumbnails, HEIC/HEIF, and video poster frames, with a hard
timeout and graceful fallback to the original file everywhere else.
- Native "Browse..." folder picker (osascript) in Settings, with manual
typing as the fallback on other platforms.
- Confirm-guarded "Empty trash" action -- the only place this project
permanently deletes anything.
- Session resume: progress now survives a server restart and an
unchanged Rescan via .swipeanything-session.json.
- Accessibility pass: live region item announcements, aria-labels on
action buttons, focus-trapped shortcuts dialog with focus restore,
visible focus rings, a real role="progressbar", and <button>s instead
of <a href="#"> in the header.
- node:test suite (23 tests) covering the folder adapter, the Immich
adapter (mocked fetch, no live server needed), and the HTTP API
end-to-end; wired up as `npm test`.
- Also includes the keyboard shortcuts (up/down undo/skip), swipe stamps,
and shortcuts modal from the previous session that hadn't been
committed yet.
Node/Express backend with a pluggable Adapter contract, a folder adapter
(safe non-destructive reject-to-trash, undo, keep/reject/skip), and a
vanilla JS swipe UI + generic settings form driven by each adapter's
configSchema.