Map keys 0–9 to destinations, inspect files before deciding, and preview PDF/RAW/ZIP/video with an OLED dark UI polish plus demo seed and tests.
4.5 KiB
4.5 KiB
Changelog
All notable changes to this project are documented here. Format loosely follows Keep a Changelog.
[Unreleased]
Added
- PDF / RAW / ZIP previews on the folder adapter: PDFs show a first-page
Quick Look thumb (iframe fallback); camera RAW (
dng,cr2,nef, …) uses QL thumbs;.ziplists contained files (no extract) via a zero-dep central-directory reader (lib/zip-list.js). - Video / CSV covered in demo seed + preview-type tests;
npm run seed-demorebuilds/tmp/swipe-demo. - File details bottom sheet: press
i/ Details / click the filename (path, size, dates; image dimensions / camera on macOS; zip entry summary). Copy path + Reveal in Finder. Setting "Show file details on each card by default". Immich returns EXIF-ish fields from its asset API. - Organize folders (keys 0–9) on the local folder adapter: map number
keys to destination folders in Settings, then press
0–9(or tap the chips) to move the current file there. Undo restores it. Destination dirs inside the source tree are excluded from the queue so sorted files don't bounce back in. - OLED dark design tokens (DM Sans + IBM Plex Mono) documented under
design-system/swipeanything/MASTER.md. - New settings field type
folderMap(and adaptergetActions()) so organize destinations are schema-driven like everything else. - Gitea Actions CI (
.gitea/workflows/ci.yml):npm test+ gitleaks on every push/PR — the first PR gate for this repo. - Settings UI polish: selected-adapter highlight, custom radios (no native connecting-line artifact), styled password/select fields, cleaner radio accessible names, and adapter-scoped settings when switching sources.
Added (earlier)
- Immich adapter (
adapters/immich.js): swipe through a self-hosted Immich photo library. Reject moves the asset to Immich's own trash; undo restores it. Second reference implementation of the adapter contract, demonstrating a remote-API source alongside the local filesystem. - Real thumbnails on macOS via a
qlmanage(Quick Look)-backed cache (lib/thumbnails.js), covering HEIC/HEIF images and video poster frames for free. Falls back to the original file on any failure/timeout or on non-macOS platforms. - Native folder picker: a "Browse…" button next to folder-type settings
fields opens a real macOS Finder dialog (
POST /api/browse-folder, viaosascript). Falls back to manual typing elsewhere. - Empty trash: a separate, confirm-guarded action (shown in the header once the folder adapter's trash is non-empty) that permanently deletes what "Reject" has moved aside. The only place this project deletes anything outright.
- Session resume: review progress now persists to
.swipeanything-session.jsonand survives a server restart (and a same-folder "Rescan"), as long as the underlying item set hasn't changed. - Accessibility pass: a live region announces "Item X of Y: name" on
every card change, action buttons get full
aria-labels (e.g. "Keep, right arrow"), the shortcuts dialog traps and restores focus, focus rings are visible everywhere, the progress bar is a realrole="progressbar"/aria-valuenow, and header actions are<button>s instead of<a href="#">. - Test suite (
test/,npm test) using Node's built-in test runner: the folder adapter against real temp directories, the Immich adapter against a mockedfetch, and the HTTP API end-to-end. passwordandselectsettings field types (used by the Immich adapter's API key and order fields).
Changed
- Adapter contract:
resolvePreviewPath(itemId)replaced withstreamPreview(itemId, res)/streamThumbnail(itemId, res), so adapters can serve previews from anywhere (local file, proxied remote fetch, etc.), not just a local path handed tores.sendFile. server.jsnow exports{ app, start }instead of callingapp.listen()at import time, and reads its config/session file paths fromSWIPEANYTHING_CONFIG_PATH/SWIPEANYTHING_SESSION_PATHwhen set — both needed to make the app testable in-process.
[0.1.0] - initial version
- Local folder adapter: swipe local files, reject moves to
.swipeanything-trash/, undo restores. - Pluggable adapter framework (
adapters/base.js) with a generic, schema-driven settings UI. - Vanilla HTML/CSS/JS swipe UI: drag gestures, keyboard shortcuts (keep/reject/skip/undo), visual keep/reject stamps, shortcuts help modal.
- Zero-build-step Node.js + Express server.