android We Migrated Away From a Google-Recommended Library Because Google Broke It EncryptedSharedPreferences was Google's own recommended way to store secrets on Android. It's now deprecated and unmaintained, and was the known source of the keyset corruption this app had to defend against.
android No Password Form: Login Flow v2 and Revocable App Passwords Photo Sweep's Android client has no login screen that asks for a password. It hands you to your own Nextcloud's login page in a browser and comes back with a revocable, per-device app password instead.
nextcloud Why the App Isn't Called 'Nextcloud Cleaner': A Trademark Rename Story The Nextcloud app store rules say plainly: apps must not use 'Nextcloud' in their name. The app was built as Nextcloud Cleaner, renamed to Photo Sweep, and the app id itself changed along the way.
nextcloud The Paperwork Nobody Tells You About Before Publishing a Nextcloud App A signing certificate for the Nextcloud app store isn't self-service: you submit a CSR as a GitHub pull request and wait for a maintainer to sign it, days rather than minutes, and the CN has to exactly match your immutable app id.
api-design A Batch Endpoint Designed for Someone Syncing 100 Decisions From a Train POST /decisions accepts either one verdict or an array of them, through the same handler and the same validation. The batch form exists so a review session with no signal doesn't turn into a hundred requests.
nextcloud One REST API, Two Clients: The Web UI and the Android App Share Every Endpoint Photo Sweep's Android client and Vue web UI both talk to the same OCS API with no client-specific endpoint anywhere. A verdict given on the phone shows up in the web review screen, and back.
nextcloud Minimizing Blast Radius When You Must Use Unstable Internals Two files in Photo Sweep touch Nextcloud internals that have no public equivalent — OC\Files\Search\* and OCA\Files_Trashbin. Both check what's available first and degrade rather than break.
nextcloud A Two-Phase Commit for File Moves, Without a Database Transaction Photo Sweep marks a verdict 'applied' only after the file has actually moved — never before. A crash between the move and the write leaves the file gone but the row still pending, and retrying handles that correctly.
design Deciding Is Separated From Doing In Photo Sweep, a verdict is just a database row until one specific action executes it. You can judge a thousand photos, change your mind about any of them, and close the tab having changed nothing.
nextcloud Resumable Background Indexing Against an API That Doesn't Support What You Need Nextcloud's file search only accepts eq/in on fileid, not gt — so a keyset cursor for resumable indexing literally cannot be expressed. Order by file id instead, and let a final sweep catch what slipped.
php Rejecting Dates That Only Look Like Dates PHP's date parser doesn't fail on 20241312 — it rolls month thirteen into January 2025. A parse that succeeds is not evidence of a real date, so Photo Sweep formats every result back and requires a match.
nextcloud Figuring Out When a Photo Was Actually Taken Nextcloud stores no first-class 'date taken' field. Photo Sweep's month-by-month review depends on one, so it walks a four-link chain — EXIF, filename, mtime, upload time — and records which link answered.