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.
3.3 KiB
3.3 KiB
Changelog
All notable changes to this project are documented here. Format loosely follows Keep a Changelog.
[Unreleased]
Added
- 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.