# Workflow - branch (from `main`) - do the work in Next Step - move Next Step to the top of Completed Steps - move the top item of Future Steps into Next Step - commit (`TODO.md` changes in the same commit as the work) - merge to `main` if the branch is not protected, otherwise open a PR - push # Status pre-1.0 # Next Step Implement the download retry policy from the README TODO: no retry on 4xx, exponential backoff on 5xx and network errors. Apply it to file and thumbnail downloads, cover it with mock-server tests, and update the README TODO checkbox. # Completed Steps - 2026-06-10: Decrypted collections shared by other users (sealed-box keys); listCollections drops deleted-collection tombstones. - 2026-06-10: Login hardening: dual-2FA empty-string fields handled, TOTP preferred when a passkey is also enrolled, interactive input via @inquirer/prompts. - 2026-06-10: Replaced sharp with pure JS (jpeg-js + exif-reader); added single-binary bun build and make install. - 2026-06-09: Added backup-metadata command (ML data always included, --exif opt-in); rewrote README to match the implementation; added thumbnail helper tests. - 2026-05-13: Full CLI surface: login, backup with dedup symlink layout, collections, files, get, get-thumb, thumbnail repair helpers. - 2026-05-13: Client OO API with literate usage tests; file download and decryption; all three metadata layers decrypted and persisted; renamed quack to quak. - 2026-05-11: SRP login flow (email OTP + TOTP) and ApiClient. # Future Steps - Retry policy: no retry on 4xx, exponential backoff on 5xx and network errors (the Next Step). - Update the README API reference section to match the current implementation. - Make `make docker` green. - Tag v1.0.0. - Future desktop client, separate repo: - Electron app skeleton consuming this library. - Local SQLite cache keyed on (collectionID, fileID, updationTime). - Background sync worker streaming new files into the cache. - Gallery UI: thumbnails, full-image view, basic search. - Upload, delete, and share operations in the library.